/ Hex Artifact Content
Login

Artifact 22af0c482e045f419b0bac58de9fb107b8a5558cce8cc850758370b27153b971:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70   pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42  A->expmask;.  pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41  ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d  ->prepFlags;.  m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74  emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72  er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f  , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61  unter));.  pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f  ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20  es not grow too 
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e  large */.  if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69  New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20  _VDBE_OP] ){.   
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  (p->db);.    ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15b0: 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20    int jj, kk;.  
15c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
15d0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  = p->pParse;.   
15e0: 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a   for(jj=kk=0; jj
15f0: 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1600: 68 65 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  he; jj++){.     
1610: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1620: 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61  e *x = pParse->a
1630: 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20  ColCache + jj;. 
1640: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1650: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1660: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
1670: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
1680: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
1690: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
16a0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
16b0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
16c0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
16d0: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
16e0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
16f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1700: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
1710: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
1720: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1730: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1740: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1750: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1760: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
1770: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1780: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1790: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
17a0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
17b0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
17c0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
17d0: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
17e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
17f0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1800: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1820: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1830: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1840: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1850: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1860: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1870: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1880: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1890: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
18a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18b0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
18c0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
18d0: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
18e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
18f0: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1900: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
1910: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1920: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
1930: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
1940: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1950: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
1960: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
1970: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
1980: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
1990: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
19a0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
19b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
19c0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
19d0: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
19e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19f0: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1a00: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
1a10: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
1a20: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1a30: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
1a40: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
1a50: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
1a60: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
1a70: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
1a80: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
1a90: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
1aa0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
1ab0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
1ac0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1ad0: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1ae0: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1af0: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1b00: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1b10: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1b20: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1b30: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1b40: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1b50: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1b60: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1b70: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1b80: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1b90: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1ba0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1bb0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1bc0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1bd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  **.** If the inp
1be0: 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e  ut string does n
1bf0: 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58 22 20  ot end with "X" 
1c00: 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c  then an OP_Resul
1c10: 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e  tRow instruction
1c20: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64  .** is generated
1c30: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20   for the values 
1c40: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69  inserted..*/.voi
1c50: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c  d sqlite3VdbeMul
1c60: 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20  tiLoad(Vdbe *p, 
1c70: 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74  int iDest, const
1c80: 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e   char *zTypes, .
1c90: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1ca0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
1cb0: 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  ar c;.  va_start
1cc0: 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20  (ap, zTypes);.  
1cd0: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54  for(i=0; (c = zT
1ce0: 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  ypes[i])!=0; i++
1cf0: 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73  ){.    if( c=='s
1d00: 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ' ){.      const
1d10: 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72   char *z = va_ar
1d20: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1d30: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
1d40: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a  3VdbeAddOp4(p, z
1d50: 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20  ==0 ? OP_Null : 
1d60: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69  OP_String8, 0, i
1d70: 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29  Dest+i, 0, z, 0)
1d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d90: 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20  c=='i' ){.      
1da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db0: 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(p, OP_Integer,
1dc0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1dd0: 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20  , iDest+i);.    
1de0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
1df0: 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74  o skip_op_result
1e00: 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  row;.    }.  }. 
1e10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e20: 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(p, OP_ResultR
1e30: 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73  ow, iDest, i);.s
1e40: 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77  kip_op_resultrow
1e50: 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  :.  va_end(ap);.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1e70: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1e80: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1e90: 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a  e as a pointer..
1ea0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1eb0: 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65  beAddOp4(.  Vdbe
1ec0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1ed0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
1ee0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
1ef0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
1f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1f10: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
1f20: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
1f30: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
1f40: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f60: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
1f70: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
1f80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1f90: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
1fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
1fb0: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1fc0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74  and */.  int p4t
1fd0: 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ype          /* 
1fe0: 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20  P4 operand type 
1ff0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
2000: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2010: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
2020: 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74  p2, p3);.  sqlit
2030: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
2040: 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74  , addr, zP4, p4t
2050: 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ype);.  return a
2060: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ddr;.}../*.** Ad
2070: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
2080: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
2090: 20 76 61 6c 75 65 20 77 69 74 68 20 61 20 50 34   value with a P4
20a0: 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f  _INT64 or.** P4_
20b0: 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e  REAL type..*/.in
20c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
20d0: 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62 65 20  Op4Dup8(.  Vdbe 
20e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
20f0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
2100: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
2110: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2120: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2130: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
2140: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
2150: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
2160: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2180: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
2190: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
21a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
21b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
21c0: 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20  st u8 *zP4,     
21d0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
21e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79  nd */.  int p4ty
21f0: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  pe          /* P
2200: 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a  4 operand type *
2210: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63  /.){.  char *p4c
2220: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  opy = sqlite3DbM
2230: 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74  allocRawNN(sqlit
2240: 65 33 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b  e3VdbeDb(p), 8);
2250: 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20 29 20  .  if( p4copy ) 
2260: 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a  memcpy(p4copy, z
2270: 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e  P4, 8);.  return
2280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2290: 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p4(p, op, p1, p2
22a0: 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34  , p3, p4copy, p4
22b0: 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  type);.}..#ifnde
22c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
22d0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PLAIN./*.** Retu
22e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
22f0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 45 58  f the current EX
2300: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2310: 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20   baseline..** 0 
2320: 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f  means "none"..*/
2330: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2340: 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 50 61  ExplainParent(Pa
2350: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2360: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
2370: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45  f( pParse->addrE
2380: 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75  xplain==0 ) retu
2390: 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73 71  rn 0;.  pOp = sq
23a0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
23b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
23c0: 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69  arse->addrExplai
23d0: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70  n);.  return pOp
23e0: 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ->p2;.}../*.** A
23f0: 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78 70 6c  dd a new OP_Expl
2400: 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ain opcode..**.*
2410: 2a 20 49 66 20 74 68 65 20 62 50 75 73 68 20 66  * If the bPush f
2420: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
2430: 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70 63 6f  n make this opco
2440: 64 65 20 74 68 65 20 70 61 72 65 6e 74 20 66 6f  de the parent fo
2450: 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20  r.** subsequent 
2460: 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c 20 73  Explains until s
2470: 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69  qlite3VdbeExplai
2480: 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c 65 64  nPop() is called
2490: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24a0: 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50 61 72  3VdbeExplain(Par
24b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38 20 62  se *pParse, u8 b
24c0: 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  Push, const char
24d0: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
24e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
24f0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
2500: 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64  ar *zMsg;.    Vd
2510: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2520: 70 56 64 62 65 3b 0a 20 20 20 20 76 61 5f 6c 69  pVdbe;.    va_li
2530: 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 69  st ap;.    int i
2540: 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 61  This;.    va_sta
2550: 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
2560: 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
2570: 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  VMPrintf(pParse-
2580: 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a  >db, zFmt, ap);.
2590: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
25a0: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
25b0: 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 73  pVdbe;.    iThis
25c0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73   = v->nOp;.    s
25d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25e0: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
25f0: 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e 61  iThis, pParse->a
2600: 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20  ddrExplain, 0,. 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59       zMsg, P4_DY
2630: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66 28 20  NAMIC);.    if( 
2640: 62 50 75 73 68 29 20 70 50 61 72 73 65 2d 3e 61  bPush) pParse->a
2650: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69 54 68  ddrExplain = iTh
2660: 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  is;.  }.}../*.**
2670: 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41 49 4e   Pop the EXPLAIN
2680: 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74 61 63   QUERY PLAN stac
2690: 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  k one level..*/.
26a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
26b0: 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72 73 65  ExplainPop(Parse
26c0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
26d0: 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  rse->addrExplain
26e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
26f0: 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 72  plainParent(pPar
2700: 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  se);.}.#endif /*
2710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2720: 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  LAIN */../*.** A
2730: 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63  dd an OP_ParseSc
2740: 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68  hema opcode.  Th
2750: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72  is routine is br
2760: 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a  oken out from.**
2770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2780: 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65  p4() since it ne
2790: 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64  eds to also need
27a0: 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74  s to mark all bt
27b0: 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e  rees.** as havin
27c0: 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a  g been used..**.
27d0: 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74  ** The zWhere st
27e0: 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62  ring must have b
27f0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
2800: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
2810: 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ()..** This rout
2820: 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77  ine will take ow
2830: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61  nership of the a
2840: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
2850: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2860: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
2870: 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  maOp(Vdbe *p, in
2880: 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68  t iDb, char *zWh
2890: 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  ere){.  int j;. 
28a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28b0: 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63  p4(p, OP_ParseSc
28c0: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c  hema, iDb, 0, 0,
28d0: 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41   zWhere, P4_DYNA
28e0: 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  MIC);.  for(j=0;
28f0: 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a   j<p->db->nDb; j
2900: 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55  ++) sqlite3VdbeU
2910: 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a  sesBtree(p, j);.
2920: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
2930: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
2940: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
2950: 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  e as an integer.
2960: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2970: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20  dbeAddOp4Int(.  
2980: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
2990: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
29a0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
29b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
29c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29d0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
29e0: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
29f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
2a00: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2a10: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
2a20: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
2a30: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
2a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a50: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
2a60: 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20    int p4        
2a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20        /* The P4 
2a80: 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e  operand as an in
2a90: 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  teger */.){.  in
2aa0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
2ab0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
2ac0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
2ad0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
2ae0: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
2af0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
2b00: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
2b10: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
2b20: 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20  = P4_INT32;.    
2b30: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a  pOp->p4.i = p4;.
2b40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
2b50: 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20  r;.}../* Insert 
2b60: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d  the end of a co-
2b70: 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20  routine.*/.void 
2b80: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
2b90: 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c  routine(Vdbe *v,
2ba0: 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a   int regYield){.
2bb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2bc0: 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
2bd0: 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
2be0: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74  );..  /* Clear t
2bf0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  he temporary reg
2c00: 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 65  ister cache, the
2c10: 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68  reby ensuring th
2c20: 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d  at each.  ** co-
2c30: 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 20  routine has its 
2c40: 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20  own independent 
2c50: 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 73  set of registers
2c60: 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75  , because co-rou
2c70: 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74  tines.  ** might
2c80: 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72 65   expect their re
2c90: 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 72  gisters to be pr
2ca0: 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 61  eserved across a
2cb0: 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a  n OP_Yield, and.
2cc0: 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20    ** that could 
2cd0: 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69  cause problems i
2ce0: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f  f two or more co
2cf0: 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73  -routines are us
2d00: 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a  ing the same.  *
2d10: 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  * temporary regi
2d20: 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e  ster..  */.  v->
2d30: 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2d40: 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73   = 0;.  v->pPars
2d50: 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
2d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2d70: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
2d80: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
2d90: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
2da0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
2db0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
2dc0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
2dd0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
2de0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
2df0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
2e00: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
2e10: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
2e20: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
2e30: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
2e40: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
2e50: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
2e60: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
2e70: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
2e80: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
2e90: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
2ea0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
2eb0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
2ec0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
2ed0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
2ee0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
2ef0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
2f00: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
2f10: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
2f20: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
2f30: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
2f40: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
2f50: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
2f60: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
2f70: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
2f80: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
2f90: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
2fa0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
2fb0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
2fc0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
2fd0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
2fe0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
2ff0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
3000: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
3010: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
3020: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
3030: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
3040: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3050: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
3060: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
3070: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
3080: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
3090: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
30a0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
30e0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
30f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
3100: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
3110: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
3120: 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52 28  }.  return ADDR(
3130: 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  i);.}../*.** Res
3140: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
3150: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
3160: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3170: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
3180: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
3190: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
31a0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
31b0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
31c0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
31d0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31e0: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
31f0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
3200: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
3210: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
3220: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
3230: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
3240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
3250: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3260: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3270: 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20  rt( j<p->nLabel 
3280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
3290: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c  0 );.  if( p->aL
32a0: 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66 20 53  abel ){.#ifdef S
32b0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
32c0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
32d0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
32e0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
32f0: 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c 56    printf("RESOLV
3300: 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25 64  E LABEL %d to %d
3310: 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b  \n", x, v->nOp);
3320: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3330: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4c 61    assert( p->aLa
3340: 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20  bel[j]==(-1) ); 
3350: 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20 6f 6e  /* Labels may on
3360: 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64 20 6f  ly be resolved o
3370: 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c  nce */.    p->aL
3380: 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70  abel[j] = v->nOp
3390: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20  ;.  }.}..#ifdef 
33a0: 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
33b0: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TEST./*.** Retur
33c0: 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e  n TRUE if and on
33d0: 6c 79 20 69 66 20 74 68 65 20 6c 61 62 65 6c 20  ly if the label 
33e0: 78 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  x has already be
33f0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 20  en resolved..** 
3400: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 28 7a 65  Return FALSE (ze
3410: 72 6f 29 20 69 66 20 6c 61 62 65 6c 20 78 20 69  ro) if label x i
3420: 73 20 73 74 69 6c 6c 20 75 6e 72 65 73 6f 6c 76  s still unresolv
3430: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
3440: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
3450: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 74 65  sed inside of te
3460: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 2c  stcase() macros,
3470: 20 61 6e 64 20 73 6f 20 69 74 0a 2a 2a 20 6f 6e   and so it.** on
3480: 6c 79 20 65 78 69 73 74 73 20 77 68 65 6e 20 6d  ly exists when m
3490: 65 61 73 75 72 69 6e 67 20 74 65 73 74 20 63 6f  easuring test co
34a0: 76 65 72 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  verage..*/.int s
34b0: 71 6c 69 74 65 33 56 64 62 65 4c 61 62 65 6c 48  qlite3VdbeLabelH
34c0: 61 73 42 65 65 6e 52 65 73 6f 6c 76 65 64 28 56  asBeenResolved(V
34d0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a  dbe *v, int x){.
34e0: 20 20 72 65 74 75 72 6e 20 76 2d 3e 70 50 61 72    return v->pPar
34f0: 73 65 2d 3e 61 4c 61 62 65 6c 20 26 26 20 76 2d  se->aLabel && v-
3500: 3e 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 5b  >pParse->aLabel[
3510: 41 44 44 52 28 78 29 5d 3e 3d 30 3b 0a 7d 0a 23  ADDR(x)]>=0;.}.#
3520: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3530: 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f  COVERAGE_TEST */
3540: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
3550: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
3560: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
3570: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
3580: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
3590: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
35a0: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
35b0: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  yOnce = 1;.}../*
35c0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
35d0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
35e0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75  n only be run mu
35f0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f  ltiple times..*/
3600: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3610: 65 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a  eReusable(Vdbe *
3620: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
3630: 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  Once = 0;.}..#if
3640: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3650: 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72   /* sqlite3Asser
3660: 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69  tMayAbort() logi
3670: 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c */../*.** The 
3680: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61  following type a
3690: 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  nd function are 
36a0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
36b0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f  through all opco
36c0: 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65  des.** in a Vdbe
36d0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e   main program an
36e0: 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75  d each of the su
36f0: 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67  b-programs (trig
3700: 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a  gers) it may .**
3710: 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79   invoke directly
3720: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   or indirectly. 
3730: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  It should be use
3740: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
3750: 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a  .**   Op *pOp;.*
3760: 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  *   VdbeOpIter s
3770: 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65  Iter;.**.**   me
3780: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3790: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
37a0: 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76  **   sIter.v = v
37b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
37d0: 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62  v is of type Vdb
37e0: 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20  e* .**   while( 
37f0: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
3800: 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a  t(&sIter)) ){.**
3810: 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74       // Do somet
3820: 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a  hing with pOp.**
3830: 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65     }.**   sqlite
3840: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
3850: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20  Iter.apSub);.** 
3860: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3870: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64  ct VdbeOpIter Vd
3880: 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74  beOpIter;.struct
3890: 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20   VdbeOpIter {.  
38a0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
38b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
38c0: 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  be to iterate th
38d0: 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65  rough the opcode
38e0: 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f  s of */.  SubPro
38f0: 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20  gram **apSub;   
3900: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
3910: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
3920: 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20    int nSub;     
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3940: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
3950: 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20  s in apSub */.  
3960: 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20  int iAddr;      
3970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
3980: 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e  dress of next in
3990: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74  struction to ret
39a0: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  urn */.  int iSu
39b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
39c0: 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20      /* 0 = main 
39d0: 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72  program, 1 = fir
39e0: 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65  st sub-program e
39f0: 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  tc. */.};.static
3a00: 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28   Op *opIterNext(
3a10: 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a  VdbeOpIter *p){.
3a20: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76    Vdbe *v = p->v
3a30: 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30  ;.  Op *pRet = 0
3a40: 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69  ;.  Op *aOp;.  i
3a50: 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70  nt nOp;..  if( p
3a60: 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20  ->iSub<=p->nSub 
3a70: 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ){..    if( p->i
3a80: 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sub==0 ){.      
3a90: 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20  aOp = v->aOp;.  
3aa0: 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70      nOp = v->nOp
3ab0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3ac0: 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75     aOp = p->apSu
3ad0: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f  b[p->iSub-1]->aO
3ae0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70  p;.      nOp = p
3af0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
3b00: 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  1]->nOp;.    }. 
3b10: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41     assert( p->iA
3b20: 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20  ddr<nOp );..    
3b30: 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69  pRet = &aOp[p->i
3b40: 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41  Addr];.    p->iA
3b50: 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  ddr++;.    if( p
3b60: 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a  ->iAddr==nOp ){.
3b70: 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b        p->iSub++;
3b80: 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20  .      p->iAddr 
3b90: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
3ba0: 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79    if( pRet->p4ty
3bb0: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
3bc0: 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  M ){.      int n
3bd0: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b  Byte = (p->nSub+
3be0: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
3bf0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e  gram*);.      in
3c00: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
3c10: 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a  =0; j<p->nSub; j
3c20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
3c30: 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52   p->apSub[j]==pR
3c40: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  et->p4.pProgram 
3c50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
3c60: 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d  .      if( j==p-
3c70: 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  >nSub ){.       
3c80: 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69   p->apSub = sqli
3c90: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
3ca0: 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53  ee(v->db, p->apS
3cb0: 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  ub, nByte);.    
3cc0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75      if( !p->apSu
3cd0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  b ){.          p
3ce0: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Ret = 0;.       
3cf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3d00: 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53    p->apSub[p->nS
3d10: 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34  ub++] = pRet->p4
3d20: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
3d30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d40: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3d50: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
3d60: 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f  Check if the pro
3d70: 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74  gram stored in t
3d80: 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64  he VM associated
3d90: 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79   with pParse may
3da0: 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f  .** throw an ABO
3db0: 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61  RT exception (ca
3dc0: 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  using the statem
3dd0: 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74  ent, but not ent
3de0: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ire transaction.
3df0: 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ** to be rolled 
3e00: 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64  back). This cond
3e10: 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ition is true if
3e20: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
3e30: 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d  m or any.** sub-
3e40: 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e  programs contain
3e50: 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  s any of the fol
3e60: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
3e70: 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20  *  OP_Halt with 
3e80: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
3e90: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
3ea0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
3eb0: 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68  _HaltIfNull with
3ec0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
3ed0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
3ee0: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
3ef0: 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a  P_Destroy.**   *
3f00: 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20    OP_VUpdate.** 
3f10: 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a    *  OP_VRename.
3f20: 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75  **   *  OP_FkCou
3f30: 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20  nter with P2==0 
3f40: 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
3f50: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
3f60: 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72  t).**   *  OP_Cr
3f70: 65 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f  eateBtree/BTREE_
3f80: 49 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e  INTKEY and OP_In
3f90: 69 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  itCoroutine .** 
3fa0: 20 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45       (for CREATE
3fb0: 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54   TABLE AS SELECT
3fc0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...).**.** Then
3fd0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
3fe0: 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d  value of Parse.m
3ff0: 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20  ayAbort is true 
4000: 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d  if an.** ABORT m
4010: 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72  ay be thrown, or
4020: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
4030: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  . Return true if
4040: 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63   it does.** matc
4050: 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  h, or false othe
4060: 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63  rwise. This func
4070: 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64  tion is intended
4080: 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a   to be used as.*
4090: 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  * part of an ass
40a0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ert statement in
40b0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53   the compiler. S
40c0: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
40d0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
40e0: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
40f0: 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64  bort(pParse->pVd
4100: 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41  be, pParse->mayA
4110: 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20  bort) );.*/.int 
4120: 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72  sqlite3VdbeAsser
4130: 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a  tMayAbort(Vdbe *
4140: 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29  v, int mayAbort)
4150: 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74  {.  int hasAbort
4160: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46   = 0;.  int hasF
4170: 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  kCounter = 0;.  
4180: 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62  int hasCreateTab
4190: 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  le = 0;.  int ha
41a0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
41b0: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
41c0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
41d0: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
41e0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
41f0: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
4200: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
4210: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
4220: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
4230: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
4240: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
4250: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
4260: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
4270: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
4280: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
4290: 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28  ename .     || (
42a0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
42b0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
42c0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
42d0: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
42e0: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
42f0: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
4300: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
4310: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
4320: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
4330: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4340: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4350: 43 72 65 61 74 65 42 74 72 65 65 20 26 26 20 70  CreateBtree && p
4360: 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e  Op->p3==BTREE_IN
4370: 54 4b 45 59 20 29 20 68 61 73 43 72 65 61 74 65  TKEY ) hasCreate
4380: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
4390: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
43a0: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
43b0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
43c0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
43d0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
43e0: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
43f0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
4400: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
4410: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
4420: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
4430: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
4440: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
4450: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
4460: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
4470: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
4480: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
4490: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
44a0: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
44b0: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
44c0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
44d0: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
44e0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
44f0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
4500: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
4510: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
4520: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
4530: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
4540: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
4550: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
4560: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
4570: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
4580: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
4590: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
45a0: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
45b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
45c0: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
45d0: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
45e0: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
45f0: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
4600: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
4610: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
4620: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4630: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
4640: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
4650: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
4660: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
4670: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4680: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
4690: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
46a0: 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73  erted.  It loops
46b0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  .** through all 
46c0: 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  the opcodes and 
46d0: 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65  fixes up some de
46e0: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29  tails..**.** (1)
46f0: 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69   For each jump i
4700: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20  nstruction with 
4710: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
4720: 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a  lue (a label).**
4730: 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65       resolve the
4740: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20   P2 value to an 
4750: 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a  actual address..
4760: 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74  **.** (2) Comput
4770: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
4780: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4790: 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53 51  s used by any SQ
47a0: 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  L function.**   
47b0: 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74    and store that
47c0: 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46   value in *pMaxF
47d0: 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28  uncArgs..**.** (
47e0: 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56 64  3) Update the Vd
47f0: 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20  be.readOnly and 
4800: 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20 66  Vdbe.bIsReader f
4810: 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74 65  lags to accurate
4820: 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61  ly.**     indica
4830: 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65 70  te what the prep
4840: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
4850: 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a  ctually does..**
4860: 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69  .** (4) Initiali
4870: 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e  ze the p4.xAdvan
4880: 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70  ce pointer on op
4890: 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20 69  codes that use i
48a0: 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63  t..**.** (5) Rec
48b0: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
48c0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74  allocated for st
48d0: 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a  oring labels..**
48e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
48f0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 74   will only funct
4900: 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20 69 66  ion correctly if
4910: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   the mkopcodeh.t
4920: 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  cl generator.** 
4930: 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73 20 74  script numbers t
4940: 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72 72 65  he opcodes corre
4950: 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73 20 74  ctly.  Changes t
4960: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  o this routine m
4970: 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 69  ust be.** coordi
4980: 6e 61 74 65 64 20 77 69 74 68 20 63 68 61 6e 67  nated with chang
4990: 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e  es to mkopcodeh.
49a0: 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tcl..*/.static v
49b0: 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  oid resolveP2Val
49c0: 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ues(Vdbe *p, int
49d0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b   *pMaxFuncArgs){
49e0: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
49f0: 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b  = *pMaxFuncArgs;
4a00: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61  .  Op *pOp;.  Pa
4a10: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
4a20: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a  >pParse;.  int *
4a30: 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d  aLabel = pParse-
4a40: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
4a50: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d  adOnly = 1;.  p-
4a60: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a  >bIsReader = 0;.
4a70: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4a80: 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 69  p->nOp-1];.  whi
4a90: 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  le(1){..    /* O
4aa0: 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65 73  nly JUMP opcodes
4ab0: 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74 20 6c   and the short l
4ac0: 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c 20 6f  ist of special o
4ad0: 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73 77  pcodes in the sw
4ae0: 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c 6f  itch.    ** belo
4af0: 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  w need to be con
4b00: 73 69 64 65 72 65 64 2e 20 20 54 68 65 20 6d 6b  sidered.  The mk
4b10: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
4b20: 72 61 74 6f 72 20 73 63 72 69 70 74 20 67 72 6f  rator script gro
4b30: 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74  ups.    ** all t
4b40: 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74 6f 67  hese opcodes tog
4b50: 65 74 68 65 72 20 6e 65 61 72 20 74 68 65 20 66  ether near the f
4b60: 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70 63 6f  ront of the opco
4b70: 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a 20  de list.  Skip. 
4b80: 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 65     ** any opcode
4b90: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
4ba0: 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67 20 62  eed processing b
4bb0: 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74 68 65  y virtual of the
4bc0: 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a   fact that.    *
4bd0: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
4be0: 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55  han SQLITE_MX_JU
4bf0: 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61 20  MP_OPCODE, as a 
4c00: 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
4c10: 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
4c20: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
4c30: 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f  code<=SQLITE_MX_
4c40: 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a 20  JUMP_OPCODE ){. 
4c50: 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65       /* NOTE: Be
4c60: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
4c70: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77 68  mkopcodeh.tcl wh
4c80: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
4c90: 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  oving.      ** c
4ca0: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
4cb0: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 20 20  witch! */.      
4cc0: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63  switch( pOp->opc
4cd0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ode ){.        c
4ce0: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
4cf0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  on: {.          
4d00: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
4d10: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
4d20: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  ;.          /* f
4d30: 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
4d40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
4d50: 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  se OP_AutoCommit
4d60: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4d70: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
4d80: 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52           p->bIsR
4d90: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
4da0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4db0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
4dc0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
4dd0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
4de0: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
4df0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4e00: 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 20  _Vacuum:.       
4e10: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c   case OP_Journal
4e20: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  Mode: {.        
4e30: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
4e40: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
4e50: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
4e60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4e70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4e80: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a    case OP_Next:.
4e90: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4ea0: 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20  NextIfOpen:.    
4eb0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
4ec0: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
4ed0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
4ee0: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
4ef0: 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  reeNext;.       
4f00: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
4f10: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
4f20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
4f30: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76  de generator nev
4f40: 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20  er codes any of 
4f50: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73  these opcodes as
4f60: 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20   a jump.        
4f70: 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e    ** to a label.
4f80: 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79    They are alway
4f90: 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d  s coded as a jum
4fa0: 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61  p backwards to a
4fb0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b   .          ** k
4fc0: 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  nown address */.
4fd0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
4fe0: 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
4ff0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5000: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5010: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a     case OP_Prev:
5020: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5030: 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20  _PrevIfOpen: {. 
5040: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
5050: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
5060: 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
5070: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
5080: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
5090: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ANCE;.          
50a0: 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
50b0: 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65  rator never code
50c0: 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f  s any of these o
50d0: 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70  pcodes as a jump
50e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
50f0: 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20   a label.  They 
5100: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64  are always coded
5110: 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77   as a jump backw
5120: 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20  ards to a .     
5130: 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64       ** known ad
5140: 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20  dress */.       
5150: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
5160: 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  p2>=0 );.       
5170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5180: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
5190: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
51a0: 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61 73  ABLE.        cas
51b0: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
51c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
51d0: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
51e0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
51f0: 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >p2;.          b
5200: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5210: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
5220: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
5230: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
5240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
5250: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20  Op - p->aOp) >= 
5260: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  3 );.          a
5270: 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
5280: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65  pcode==OP_Intege
5290: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  r );.          n
52a0: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
52b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e           if( n>n
52c0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
52d0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
52e0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
52f0: 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61 75  h into the defau
5300: 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  lt case */.     
5310: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
5320: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5330: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
5340: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
5350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f        /* The mko
5360: 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70  pcodeh.tcl scrip
5370: 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65  t has so arrange
5380: 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68  d things that th
5390: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 20  e only.         
53a0: 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f     ** non-jump o
53b0: 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e  pcodes less than
53c0: 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f   SQLITE_MX_JUMP_
53d0: 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74  CODE are guarant
53e0: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
53f0: 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e     ** have non-n
5400: 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 66  egative values f
5410: 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20  or P2. */.      
5420: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 73        assert( (s
5430: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
5440: 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  erty[pOp->opcode
5450: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
5460: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
5470: 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28 70    assert( ADDR(p
5480: 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d 3e  Op->p2)<pParse->
5490: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
54a0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
54b0: 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d  aLabel[ADDR(pOp-
54c0: 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20 20 20  >p2)];.         
54d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
54e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
54f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54      }.      /* T
5500: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5510: 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20 61   script has so a
5520: 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74  rranged things t
5530: 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20  hat the only.   
5540: 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f     ** non-jump o
5550: 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e  pcodes less than
5560: 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f   SQLITE_MX_JUMP_
5570: 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74  CODE are guarant
5580: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eed to.      ** 
5590: 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  have non-negativ
55a0: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e  e values for P2.
55b0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
55c0: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
55d0: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
55e0: 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d 50  code]&OPFLG_JUMP
55f0: 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3e  )==0 || pOp->p2>
5600: 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  =0);.    }.    i
5610: 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29  f( pOp==p->aOp )
5620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d   break;.    pOp-
5630: 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  -;.  }.  sqlite3
5640: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50  DbFree(p->db, pP
5650: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  arse->aLabel);. 
5660: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20   pParse->aLabel 
5670: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
5680: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d  Label = 0;.  *pM
5690: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
56a0: 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28  xArgs;.  assert(
56b0: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30   p->bIsReader!=0
56c0: 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   || DbMaskAllZer
56d0: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
56e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
56f0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
5700: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
5710: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
5720: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
5730: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5740: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
5750: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5760: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5770: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
5780: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
5790: 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20 6c  Verify that at l
57a0: 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c  east N opcode sl
57b0: 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ots are availabl
57c0: 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a  e in p without.*
57d0: 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c  * having to mall
57e0: 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63  oc for more spac
57f0: 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20 63  e (except when c
5800: 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a  ompiled using.**
5810: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
5820: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54  LLOC_STRESS).  T
5830: 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
5840: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
5850: 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66  ting.** to verif
5860: 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 63  y that certain c
5870: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
5880: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63  dbeAddOpList() c
5890: 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c  an never.** fail
58a0: 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61   due to a OOM fa
58b0: 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68  ult and hence th
58c0: 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  at the return va
58d0: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  lue from.** sqli
58e0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
58f0: 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  () will always b
5900: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23  e non-NULL..*/.#
5910: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5920: 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66  E_DEBUG) && !def
5930: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
5940: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29  _REALLOC_STRESS)
5950: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5960: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
5970: 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c  equired(Vdbe *p,
5980: 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
5990: 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d  t( p->nOp + N <=
59a0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
59b0: 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  lloc );.}.#endif
59c0: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
59d0: 68 61 74 20 74 68 65 20 56 4d 20 70 61 73 73 65  hat the VM passe
59e0: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
59f0: 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  gument does not 
5a00: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50  contain.** an OP
5a10: 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
5a20: 65 2e 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72  e. Fail an asser
5a30: 74 28 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20  t() if it does. 
5a40: 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  This is used.** 
5a50: 62 79 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d  by code in pragm
5a60: 61 2e 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68  a.c to ensure th
5a70: 61 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  at the implement
5a80: 61 74 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e  ation of certain
5a90: 0a 2a 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70  .** pragmas comp
5aa0: 6f 72 74 73 20 77 69 74 68 20 74 68 65 20 66 6c  orts with the fl
5ab0: 61 67 73 20 73 70 65 63 69 66 69 65 64 20 69 6e  ags specified in
5ac0: 20 74 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62   the mkpragmatab
5ad0: 2e 74 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a  .tcl.** script..
5ae0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
5af0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
5b00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5b10: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
5b20: 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  ESS).void sqlite
5b30: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73  3VdbeVerifyNoRes
5b40: 75 6c 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b  ultRow(Vdbe *p){
5b50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5b60: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
5b70: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
5b80: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
5b90: 65 21 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  e!=OP_ResultRow 
5ba0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
5bb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5bc0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
5bd0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
5be0: 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61  ray of opcodes a
5bf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
5c00: 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  * the Vdbe passe
5c10: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
5c20: 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74  rgument. It is t
5c30: 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
5c40: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20  nsibility.** to 
5c50: 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20  arrange for the 
5c60: 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74  returned array t
5c70: 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  o be eventually 
5c80: 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20  freed using the 
5c90: 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72  .** vdbeFreeOpAr
5ca0: 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ray() function..
5cb0: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
5cc0: 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73  urning, *pnOp is
5cd0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
5ce0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
5cf0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
5d00: 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70   array. Also, *p
5d10: 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74  nMaxArg is set t
5d20: 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20  o the larger of 
5d30: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
5d40: 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75  e and .** the nu
5d50: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
5d60: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  in the Vdbe.apAr
5d70: 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72  g[] array requir
5d80: 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  ed to execute th
5d90: 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70  e .** returned p
5da0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f  rogram..*/.VdbeO
5db0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61  p *sqlite3VdbeTa
5dc0: 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  keOpArray(Vdbe *
5dd0: 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e  p, int *pnOp, in
5de0: 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20  t *pnMaxArg){.  
5df0: 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d  VdbeOp *aOp = p-
5e00: 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >aOp;.  assert( 
5e10: 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d  aOp && !p->db->m
5e20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
5e30: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
5e40: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
5e50: 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63  tree() was not c
5e60: 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d  alled on this VM
5e70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62   */.  assert( Db
5e80: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
5e90: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20  treeMask) );..  
5ea0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
5eb0: 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20  p, pnMaxArg);.  
5ec0: 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  *pnOp = p->nOp;.
5ed0: 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20    p->aOp = 0;.  
5ee0: 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f  return aOp;.}../
5ef0: 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65  *.** Add a whole
5f00: 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69   list of operati
5f10: 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ons to the opera
5f20: 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74  tion stack.  Ret
5f30: 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  urn a.** pointer
5f40: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70   to the first op
5f50: 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64  eration inserted
5f60: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f  ..**.** Non-zero
5f70: 20 50 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   P2 arguments to
5f80: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
5f90: 6e 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  ns are automatic
5fa0: 61 6c 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a  ally adjusted.**
5fb0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d   so that the jum
5fc0: 70 20 74 61 72 67 65 74 20 69 73 20 72 65 6c 61  p target is rela
5fd0: 74 69 76 65 20 74 6f 20 74 68 65 20 66 69 72 73  tive to the firs
5fe0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
5ff0: 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rted..*/.VdbeOp 
6000: 2a 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f  *sqlite3VdbeAddO
6010: 70 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  pList(.  Vdbe *p
6020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6030: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63        /* Add opc
6040: 6f 64 65 73 20 74 6f 20 74 68 65 20 70 72 65 70  odes to the prep
6050: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
6060: 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20  /.  int nOp,    
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70   /* Number of op
6090: 63 6f 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a  codes to add */.
60a0: 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e    VdbeOpList con
60b0: 73 74 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f  st *aOp,       /
60c0: 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f  * The opcodes to
60d0: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
60e0: 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20  nt iLineno      
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6100: 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20  ource-file line 
6110: 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20  number of first 
6120: 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69  opcode */.){.  i
6130: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a  nt i;.  VdbeOp *
6140: 70 4f 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20  pOut, *pFirst;. 
6150: 20 61 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29   assert( nOp>0 )
6160: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
6170: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
6180: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
6190: 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d  ->nOp + nOp > p-
61a0: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
61b0: 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79  c && growOpArray
61c0: 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20  (p, nOp) ){.    
61d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
61e0: 70 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20  pFirst = pOut = 
61f0: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
6200: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
6210: 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70  p; i++, aOp++, p
6220: 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74  Out++){.    pOut
6230: 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e  ->opcode = aOp->
6240: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74  opcode;.    pOut
6250: 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a  ->p1 = aOp->p1;.
6260: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
6270: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65  Op->p2;.    asse
6280: 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( aOp->p2>=0 )
6290: 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74  ;.    if( (sqlit
62a0: 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  e3OpcodeProperty
62b0: 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20  [aOp->opcode] & 
62c0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26  OPFLG_JUMP)!=0 &
62d0: 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20  & aOp->p2>0 ){. 
62e0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d       pOut->p2 +=
62f0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20   p->nOp;.    }. 
6300: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f     pOut->p3 = aO
6310: 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d  p->p3;.    pOut-
6320: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
6330: 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  USED;.    pOut->
6340: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
6350: 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64  ut->p5 = 0;.#ifd
6360: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6370: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
6380: 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d  S.    pOut->zCom
6390: 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ment = 0;.#endif
63a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
63b0: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20  DBE_COVERAGE.   
63c0: 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20   pOut->iSrcLine 
63d0: 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c  = iLineno+i;.#el
63e0: 73 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69  se.    (void)iLi
63f0: 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  neno;.#endif.#if
6400: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6410: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
6420: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
6430: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
6440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6450: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70  bePrintOp(0, i+p
6460: 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69  ->nOp, &p->aOp[i
6470: 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d  +p->nOp]);.    }
6480: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d  .#endif.  }.  p-
6490: 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72  >nOp += nOp;.  r
64a0: 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a  eturn pFirst;.}.
64b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
64c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
64d0: 53 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a  SCANSTATUS)./*.*
64e0: 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74  * Add an entry t
64f0: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 63  o the array of c
6500: 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20  ounters managed 
6510: 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  by sqlite3_stmt_
6520: 73 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f  scanstatus()..*/
6530: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6540: 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56  eScanStatus(.  V
6550: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6570: 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e  * VM to add scan
6580: 73 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20  status() to */. 
6590: 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
65a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
65b0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
65c0: 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29  P_Explain (or 0)
65d0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f   */.  int addrLo
65e0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
65f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
6600: 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72   of loop counter
6610: 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56   */ .  int addrV
6620: 69 73 69 74 2c 20 20 20 20 20 20 20 20 20 20 20  isit,           
6630: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
6640: 73 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  s of rows visite
6650: 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c  d counter */.  L
6660: 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20  ogEst nEst,     
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6680: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
6690: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
66a0: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
66b0: 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20  r *zName        
66c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
66d0: 66 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  f table or index
66e0: 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a   being scanned *
66f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
6700: 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20   = (p->nScan+1) 
6710: 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61  * sizeof(ScanSta
6720: 74 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74  tus);.  ScanStat
6730: 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77  us *aNew;.  aNew
6740: 20 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29   = (ScanStatus*)
6750: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
6760: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e  (p->db, p->aScan
6770: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
6780: 61 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e  aNew ){.    Scan
6790: 53 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26  Status *pNew = &
67a0: 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d  aNew[p->nScan++]
67b0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
67c0: 45 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78  Explain = addrEx
67d0: 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d  plain;.    pNew-
67e0: 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72  >addrLoop = addr
67f0: 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Loop;.    pNew->
6800: 61 64 64 72 56 69 73 69 74 20 3d 20 61 64 64 72  addrVisit = addr
6810: 56 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d  Visit;.    pNew-
6820: 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20  >nEst = nEst;.  
6830: 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20    pNew->zName = 
6840: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
6850: 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  p->db, zName);. 
6860: 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e     p->aScan = aN
6870: 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ew;.  }.}.#endif
6880: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
6890: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
68a0: 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20   opcode, or P1, 
68b0: 50 32 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70  P2, P3, or P5 op
68c0: 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20  erands.** for a 
68d0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
68e0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
68f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f  lite3VdbeChangeO
6900: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
6910: 33 32 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77  32 addr, u8 iNew
6920: 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74  Opcode){.  sqlit
6930: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
6940: 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e  dr)->opcode = iN
6950: 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64  ewOpcode;.}.void
6960: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6970: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33  geP1(Vdbe *p, u3
6980: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
6990: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
69a0: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31  etOp(p,addr)->p1
69b0: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
69c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
69d0: 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P2(Vdbe *p, u32 
69e0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
69f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
6a00: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d  Op(p,addr)->p2 =
6a10: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
6a20: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
6a30: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
6a40: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
6a50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
6a60: 28 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76  (p,addr)->p3 = v
6a70: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
6a80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
6a90: 64 62 65 20 2a 70 2c 20 75 31 36 20 70 35 29 7b  dbe *p, u16 p5){
6aa0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6ab0: 70 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  p>0 || p->db->ma
6ac0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6ad0: 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70  if( p->nOp>0 ) p
6ae0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6af0: 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  p5 = p5;.}../*.*
6b00: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
6b10: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
6b20: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
6b30: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
6b40: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
6b50: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
6b60: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
6b70: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
6b80: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
6b90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
6ba0: 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr){.  sqlite3Vd
6bb0: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
6bc0: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a  dr, p->nOp);.}..
6bd0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
6be0: 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75  put FuncDef stru
6bf0: 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72  cture is ephemer
6c00: 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74  al, then free it
6c10: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e  .  If.** the Fun
6c20: 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65  cDef is not ephe
6c30: 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rmal, then do no
6c40: 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  thing..*/.static
6c50: 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65   void freeEpheme
6c60: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69  ralFunction(sqli
6c70: 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66  te3 *db, FuncDef
6c80: 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28   *pDef){.  if( (
6c90: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
6ca0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
6cb0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
6cc0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
6cd0: 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a  b, pDef);.  }.}.
6ce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
6cf0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
6d00: 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e  ite3 *, Op *, in
6d10: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  t);../*.** Delet
6d20: 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20  e a P4 value if 
6d30: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74  necessary..*/.st
6d40: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
6d50: 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34  LINE void freeP4
6d60: 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Mem(sqlite3 *db,
6d70: 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20   Mem *p){.  if( 
6d80: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
6d90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6da0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73  p->zMalloc);.  s
6db0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
6dc0: 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20  b, p);.}.static 
6dd0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
6de0: 76 6f 69 64 20 66 72 65 65 50 34 46 75 6e 63 43  void freeP4FuncC
6df0: 74 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  tx(sqlite3 *db, 
6e00: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6e10: 2a 70 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d  *p){.  freeEphem
6e20: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c  eralFunction(db,
6e30: 20 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c   p->pFunc);. sql
6e40: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
6e50: 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   p);.}.static vo
6e60: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
6e70: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
6e80: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
6e90: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
6ea0: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
6eb0: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  {.    case P4_FU
6ec0: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66  NCCTX: {.      f
6ed0: 72 65 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c  reeP4FuncCtx(db,
6ee0: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78   (sqlite3_contex
6ef0: 74 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  t*)p4);.      br
6f00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6f10: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
6f20: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
6f30: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
6f40: 4d 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34  MIC:.    case P4
6f50: 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61  _DYNBLOB:.    ca
6f60: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
6f70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
6f80: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
6f90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6fa0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  }.    case P4_KE
6fb0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
6fc0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
6fd0: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
6fe0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65  KeyInfoUnref((Ke
6ff0: 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20  yInfo*)p4);.    
7000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7010: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7020: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
7030: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50  .    case P4_EXP
7040: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
7050: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7060: 20 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20   (Expr*)p4);.   
7070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7080: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
7090: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
70a0: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
70b0: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
70c0: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
70d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
70e0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
70f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d   {.      if( db-
7100: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
7110: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7120: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
7130: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
7140: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7150: 20 20 20 20 20 20 20 66 72 65 65 50 34 4d 65 6d         freeP4Mem
7160: 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29 3b 0a  (db, (Mem*)p4);.
7170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7180: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7190: 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a  ase P4_VTAB : {.
71a0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
71b0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
71c0: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
71d0: 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b  k((VTable *)p4);
71e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
71f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7200: 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20   Free the space 
7210: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f  allocated for aO
7220: 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c  p and any p4 val
7230: 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ues allocated fo
7240: 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73  r the.** opcodes
7250: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
7260: 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74  n. If aOp is not
7270: 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75   NULL it is assu
7280: 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a  med to contain .
7290: 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20  ** nOp entries. 
72a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
72b0: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
72c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20  sqlite3 *db, Op 
72d0: 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a  *aOp, int nOp){.
72e0: 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20    if( aOp ){.   
72f0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f   Op *pOp;.    fo
7300: 72 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70 2d 31  r(pOp=&aOp[nOp-1
7310: 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20 70 4f 70  ]; pOp>=aOp; pOp
7320: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
7330: 4f 70 2d 3e 70 34 74 79 70 65 20 3c 3d 20 50 34  Op->p4type <= P4
7340: 5f 46 52 45 45 5f 49 46 5f 4c 45 20 29 20 66 72  _FREE_IF_LE ) fr
7350: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
7360: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
7370: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7380: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
7390: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71  OMMENTS.      sq
73a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
73b0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
73c0: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
73d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
73e0: 72 65 65 4e 4e 28 64 62 2c 20 61 4f 70 29 3b 0a  reeNN(db, aOp);.
73f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e    }.}../*.** Lin
7400: 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d  k the SubProgram
7410: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
7420: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7430: 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c  ument into the l
7440: 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74  inked.** list at
7450: 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61   Vdbe.pSubProgra
7460: 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20  m. This list is 
7470: 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61  used to delete a
7480: 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a  ll sub-program.*
7490: 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74  * objects when t
74a0: 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67  he VM is no long
74b0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
74c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
74d0: 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56  LinkSubProgram(V
74e0: 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50  dbe *pVdbe, SubP
74f0: 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d  rogram *p){.  p-
7500: 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e  >pNext = pVdbe->
7510: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62  pProgram;.  pVdb
7520: 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b  e->pProgram = p;
7530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7540: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61   the opcode at a
7550: 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70  ddr into OP_Noop
7560: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
7570: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
7580: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
7590: 72 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  r){.  VdbeOp *pO
75a0: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  p;.  if( p->db->
75b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
75c0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
75d0: 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64  t( addr>=0 && ad
75e0: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70  dr<p->nOp );.  p
75f0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
7600: 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 70 2d 3e  r];.  freeP4(p->
7610: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
7620: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
7630: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
7640: 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e  NOTUSED;.  pOp->
7650: 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.z = 0;.  pOp-
7660: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
7670: 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  p;.  return 1;.}
7680: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ../*.** If the l
7690: 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f  ast opcode is "o
76a0: 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  p" and it is not
76b0: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
76c0: 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d  ion,.** then rem
76d0: 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20  ove it.  Return 
76e0: 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79  true if and only
76f0: 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61   if an opcode wa
7700: 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  s removed..*/.in
7710: 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  t sqlite3VdbeDel
7720: 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56  etePriorOpcode(V
7730: 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a  dbe *p, u8 op){.
7740: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 26    if( p->nOp>0 &
7750: 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  & p->aOp[p->nOp-
7760: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b  1].opcode==op ){
7770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
7780: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
7790: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
77a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
77b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
77c0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
77d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
77e0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
77f0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
7800: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
7810: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
7820: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
7830: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
7840: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
7850: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
7860: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
7870: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
7880: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
7890: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
78a0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
78b0: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
78c0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
78d0: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
78e0: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
78f0: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
7900: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
7910: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
7920: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
7930: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
7940: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
7950: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
7960: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
7970: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
7980: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
7990: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
79a0: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20  ytes of zP4..** 
79b0: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
79c0: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
79d0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
79e0: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
79f0: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
7a00: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
7a10: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
7a20: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
7a30: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
7a40: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
7a50: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
7a60: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
7a70: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
7a80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
7a90: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
7aa0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
7ab0: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
7ac0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  nstruction..*/.s
7ad0: 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
7ae0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43  E_NOINLINE vdbeC
7af0: 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56  hangeP4Full(.  V
7b00: 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f  dbe *p,.  Op *pO
7b10: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
7b20: 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b  *zP4,.  int n.){
7b30: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79  .  if( pOp->p4ty
7b40: 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34  pe ){.    freeP4
7b50: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
7b60: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
7b70: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7b80: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
7b90: 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  4.p = 0;.  }.  i
7ba0: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( n<0 ){.    sq
7bb0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7bc0: 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d  4(p, (int)(pOp -
7bd0: 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e   p->aOp), zP4, n
7be0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7bf0: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
7c00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7c10: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
7c20: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
7c30: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
7c40: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
7c50: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
7c60: 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  IC;.  }.}.void s
7c70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7c80: 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P4(Vdbe *p, int 
7c90: 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  addr, const char
7ca0: 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20   *zP4, int n){. 
7cb0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69   Op *pOp;.  sqli
7cc0: 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
7cd0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20  t( p!=0 );.  db 
7ce0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
7cf0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
7d00: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
7d10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
7d20: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
7d30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
7d40: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7d50: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d  d ){.    if( n!=
7d60: 50 34 5f 56 54 41 42 20 29 20 66 72 65 65 50 34  P4_VTAB ) freeP4
7d70: 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a  (db, n, (void*)*
7d80: 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20  (char**)&zP4);. 
7d90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7da0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
7db0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
7dc0: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
7dd0: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
7de0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
7df0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  - 1;.  }.  pOp =
7e00: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
7e10: 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f    if( n>=0 || pO
7e20: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
7e30: 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c   vdbeChangeP4Ful
7e40: 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e  l(p, pOp, zP4, n
7e50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7e60: 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49   }.  if( n==P4_I
7e70: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
7e80: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
7e90: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
7ea0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
7eb0: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
7ec0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
7ed0: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
7ee0: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
7ef0: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
7f00: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
7f10: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
7f20: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
7f30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
7f40: 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  4!=0 ){.    asse
7f50: 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70  rt( n<0 );.    p
7f60: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
7f70: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
7f80: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
7f90: 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28   char)n;.    if(
7fa0: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71   n==P4_VTAB ) sq
7fb0: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
7fc0: 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d  Table*)zP4);.  }
7fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7fe0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
7ff0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8000: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
8010: 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68  uction .** to th
8020: 65 20 76 61 6c 75 65 20 64 65 66 69 6e 65 64 20  e value defined 
8030: 62 79 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  by the arguments
8040: 2e 20 20 54 68 69 73 20 69 73 20 61 20 68 69 67  .  This is a hig
8050: 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65 72 73 69  h-speed.** versi
8060: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
8070: 65 43 68 61 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a  eChangeP4()..**.
8080: 2a 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  ** The P4 operan
8090: 64 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  d must not have 
80a0: 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
80b0: 64 65 66 69 6e 65 64 2e 20 20 41 6e 64 20 74 68  defined.  And th
80c0: 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d 75 73 74  e new.** P4 must
80d0: 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e 54 33 32   not be P4_INT32
80e0: 2e 20 20 55 73 65 20 73 71 6c 69 74 65 33 56 64  .  Use sqlite3Vd
80f0: 62 65 43 68 61 6e 67 65 50 34 28 29 20 69 6e 20  beChangeP4() in 
8100: 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 74 68 6f  either of.** tho
8110: 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69  se cases..*/.voi
8120: 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70  d sqlite3VdbeApp
8130: 65 6e 64 50 34 28 56 64 62 65 20 2a 70 2c 20 76  endP4(Vdbe *p, v
8140: 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74 20 6e 29  oid *pP4, int n)
8150: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  {.  VdbeOp *pOp;
8160: 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 50 34  .  assert( n!=P4
8170: 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d 50 34 5f  _INT32 && n!=P4_
8180: 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74  VTAB );.  assert
8190: 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( n<=0 );.  if( 
81a0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
81b0: 6c 65 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50  led ){.    freeP
81c0: 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 50 34 29  4(p->db, n, pP4)
81d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
81e0: 73 73 65 72 74 28 20 70 50 34 21 3d 30 20 29 3b  ssert( pP4!=0 );
81f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8200: 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70  nOp>0 );.    pOp
8210: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
8220: 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  p-1];.    assert
8230: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
8240: 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 20 20 20  4_NOTUSED );.   
8250: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e   pOp->p4type = n
8260: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
8270: 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pP4;.  }.}../*
8280: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f  .** Set the P4 o
8290: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
82a0: 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65  tly added opcode
82b0: 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   to the KeyInfo 
82c0: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  for the.** index
82d0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
82e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
82f0: 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
8300: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
8310: 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  dx){.  Vdbe *v =
8320: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
8330: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
8340: 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 76  nfo;.  assert( v
8350: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8360: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 70 4b   pIdx!=0 );.  pK
8370: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
8380: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
8390: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
83a0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 20 73  if( pKeyInfo ) s
83b0: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
83c0: 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  P4(v, pKeyInfo, 
83d0: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a  P4_KEYINFO);.}..
83e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
83f0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
8400: 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  MENTS./*.** Chan
8410: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
8420: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
8430: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
8440: 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e  ction.  Or.** in
8450: 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64  sert a No-op and
8460: 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74   add the comment
8470: 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73   to that new ins
8480: 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a  truction.  This.
8490: 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64  ** makes the cod
84a0: 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64  e easier to read
84b0: 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e   during debuggin
84c0: 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73  g.  None of this
84d0: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61   happens.** in a
84e0: 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
84f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8500: 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56  d vdbeVComment(V
8510: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
8520: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f  ar *zFormat, va_
8530: 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65  list ap){.  asse
8540: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
8550: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
8560: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
8570: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
8580: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
8590: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
85a0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
85b0: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61   p->nOp ){.    a
85c0: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b  ssert( p->aOp );
85d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
85e0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  ee(p->db, p->aOp
85f0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
8600: 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  ent);.    p->aOp
8610: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
8620: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  ent = sqlite3VMP
8630: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
8640: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d  rmat, ap);.  }.}
8650: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8660: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
8670: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
8680: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
8690: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
86a0: 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61   p ){.    va_sta
86b0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
86c0: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
86d0: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
86e0: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
86f0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
8700: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
8710: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
8720: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
8730: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
8740: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
8750: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8760: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
8770: 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  op);.    va_star
8780: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
8790: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
87a0: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
87b0: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
87c0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
87d0: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  /* NDEBUG */..#i
87e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
87f0: 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20  _COVERAGE./*.** 
8800: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66  Set the value if
8810: 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69   the iSrcLine fi
8820: 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  eld for the prev
8830: 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73  iously coded ins
8840: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
8850: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
8860: 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20  LineNumber(Vdbe 
8870: 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a  *v, int iLine){.
8880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
8890: 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69  Op(v,-1)->iSrcLi
88a0: 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65  ne = iLine;.}.#e
88b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56  ndif /* SQLITE_V
88c0: 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a  DBE_COVERAGE */.
88d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
88e0: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
88f0: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49  iven address.  I
8900: 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73  f the address is
8910: 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74   -1, then.** ret
8920: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
8930: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f  ently inserted o
8940: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pcode..**.** If 
8950: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
8960: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
8970: 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20  curred prior to 
8980: 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74  the calling of t
8990: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  his.** routine, 
89a0: 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
89b0: 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70  o a dummy VdbeOp
89c0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
89d0: 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a  d.  That opcode.
89e0: 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62  ** is readable b
89f0: 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c  ut not writable,
8a00: 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61   though it is ca
8a10: 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65  st to a writable
8a20: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
8a30: 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79  eturn of a dummy
8a40: 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74   opcode allows t
8a50: 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69  he call to conti
8a60: 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a  nue functioning.
8a70: 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20  ** after an OOM 
8a80: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
8a90: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
8aa0: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
8ab0: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
8ac0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
8ad0: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
8ae0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
8af0: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
8b00: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
8b10: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
8b20: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
8b30: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
8b40: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
8b50: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
8b60: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62  Valgrind..*/.Vdb
8b70: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
8b80: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
8b90: 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43  nt addr){.  /* C
8ba0: 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61  89 specifies tha
8bb0: 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22  t the constant "
8bc0: 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69  dummy" will be i
8bd0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
8be0: 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68  l.  ** zeros, wh
8bf0: 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20  ich is correct. 
8c00: 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20   MSVC generates 
8c10: 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72  a warning, never
8c20: 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74  theless. */.  st
8c30: 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d  atic VdbeOp dumm
8c40: 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  y;  /* Ignore th
8c50: 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61  e MSVC warning a
8c60: 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69  bout no initiali
8c70: 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  zer */.  assert(
8c80: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
8c90: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
8ca0: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
8cb0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
8cc0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
8cd0: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
8ce0: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
8cf0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8d00: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
8d10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8d20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
8d30: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
8d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
8d50: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
8d60: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
8d70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8d80: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
8d90: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NTS)./*.** Retur
8da0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  n an integer val
8db0: 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ue for one of th
8dc0: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
8dd0: 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a  the opcode pOp.*
8de0: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
8df0: 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a  character c..*/.
8e00: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
8e10: 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f  lateP(char c, co
8e20: 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  nst Op *pOp){.  
8e30: 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74  if( c=='1' ) ret
8e40: 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  urn pOp->p1;.  i
8e50: 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75  f( c=='2' ) retu
8e60: 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66  rn pOp->p2;.  if
8e70: 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72  ( c=='3' ) retur
8e80: 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  n pOp->p3;.  if(
8e90: 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e   c=='4' ) return
8ea0: 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65   pOp->p4.i;.  re
8eb0: 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a  turn pOp->p5;.}.
8ec0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8ed0: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
8ee0: 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20  "comment" field 
8ef0: 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65  of a VDBE opcode
8f00: 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   listing..**.** 
8f10: 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69  The Synopsis: fi
8f20: 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20  eld in comments 
8f30: 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  in the vdbe.c so
8f40: 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63  urce file gets c
8f50: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61  onverted.** to a
8f60: 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74  n extra string t
8f70: 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20  hat is appended 
8f80: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70  to the sqlite3Op
8f90: 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20  codeName().  In 
8fa0: 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f  the.** absence o
8fb0: 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73  f other comments
8fc0: 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20  , this synopsis 
8fd0: 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d  becomes the comm
8fe0: 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64  ent on the opcod
8ff0: 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73  e..** Some trans
9000: 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a  lation occurs:.*
9010: 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20  *.**       "PX" 
9020: 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a       ->  "r[X]".
9030: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22  **       "PX@PY"
9040: 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59     ->  "r[X..X+Y
9050: 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20  -1]"  or "r[x]" 
9060: 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a  if y is 0 or 1.*
9070: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31  *       "PX@PY+1
9080: 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d  " ->  "r[X..X+Y]
9090: 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  "    or "r[x]" i
90a0: 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20  f y is 0.**     
90b0: 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20    "PY..PY"  ->  
90c0: 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f  "r[X..Y]"      o
90d0: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78  r "r[x]" if y<=x
90e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
90f0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20  isplayComment(. 
9100: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20   const Op *pOp, 
9110: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
9120: 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65  e to be commente
9130: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
9140: 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65  r *zP4,   /* Pre
9150: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
9160: 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f   value for P4 */
9170: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  .  char *zTemp, 
9180: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
9190: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20  esult here */.  
91a0: 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20  int nTemp       
91b0: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69     /* Space avai
91c0: 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d  lable in zTemp[]
91d0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
91e0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
91f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e  const char *zSyn
9200: 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70  opsis;.  int nOp
9210: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20  Name;.  int ii, 
9220: 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74 5b  jj;.  char zAlt[
9230: 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d  50];.  zOpName =
9240: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
9250: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
9260: 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  nOpName = sql
9270: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
9280: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70  Name);.  if( zOp
9290: 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20  Name[nOpName+1] 
92a0: 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43  ){.    int seenC
92b0: 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  om = 0;.    char
92c0: 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69   c;.    zSynopsi
92d0: 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e  s = zOpName += n
92e0: 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20  OpName + 1;.    
92f0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
9300: 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 29 3d 3d  opsis,"IF ",3)==
9310: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
9320: 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f  Op->p5 & SQLITE_
9330: 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20  STOREP2 ){.     
9340: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9350: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29  ntf(sizeof(zAlt)
9360: 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20 3d  , zAlt, "r[P2] =
9370: 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73 69   (%s)", zSynopsi
9380: 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s+3);.      }els
9390: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
93a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
93b0: 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20  of(zAlt), zAlt, 
93c0: 22 69 66 20 25 73 20 67 6f 74 6f 20 50 32 22 2c  "if %s goto P2",
93d0: 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20   zSynopsis+3);. 
93e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 79       }.      zSy
93f0: 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a 20  nopsis = zAlt;. 
9400: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
9410: 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31  jj=0; jj<nTemp-1
9420: 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73   && (c = zSynops
9430: 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b  is[ii])!=0; ii++
9440: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ){.      if( c==
9450: 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'P' ){.        c
9460: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69   = zSynopsis[++i
9470: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
9480: 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20  c=='4' ){.      
9490: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
94a0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
94b0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a  Temp+jj, "%s", z
94c0: 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  P4);.        }el
94d0: 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b  se if( c=='X' ){
94e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
94f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9500: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
9510: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
9520: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
9530: 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20  seenCom = 1;.   
9540: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9550: 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74        int v1 = t
9560: 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70  ranslateP(c, pOp
9570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
9580: 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73   v2;.          s
9590: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
95a0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
95b0: 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20  jj, "%d", v1);. 
95c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
95d0: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
95e0: 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30  i+1, "@P", 2)==0
95f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9600: 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20  ii += 3;.       
9610: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
9620: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
9630: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +jj);.          
9640: 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65    v2 = translate
9650: 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c  P(zSynopsis[ii],
9660: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
9670: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
9680: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b  Synopsis+ii+1,"+
9690: 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  1",2)==0 ){.    
96a0: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
96b0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
96c0: 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20   v2++;.         
96d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
96e0: 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20   if( v2>1 ){.   
96f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9700: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9710: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
9720: 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29  "..%d", v1+v2-1)
9730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9740: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
9750: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
9760: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50  opsis+ii+1, "..P
9770: 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70  3", 4)==0 && pOp
9780: 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p3==0 ){.     
9790: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a         ii += 4;.
97a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
97b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a      }.        jj
97c0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
97d0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
97e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
97f0: 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20      zTemp[jj++] 
9800: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = c;.      }.   
9810: 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
9820: 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d  Com && jj<nTemp-
9830: 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  5 && pOp->zComme
9840: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
9850: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9860: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
9870: 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43   "; %s", pOp->zC
9880: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a  omment);.      j
9890: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
98a0: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
98b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a      }.    if( jj
98c0: 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a  <nTemp ) zTemp[j
98d0: 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  j] = 0;.  }else 
98e0: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
98f0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
9900: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
9910: 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f   zTemp, "%s", pO
9920: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
9930: 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74    jj = sqlite3St
9940: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
9950: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d   }else{.    zTem
9960: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a  p[0] = 0;.    jj
9970: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
9980: 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn jj;.}.#endif 
9990: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
99a0: 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  */..#if VDBE_DIS
99b0: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
99c0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
99d0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f  _CURSOR_HINTS)./
99e0: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74  *.** Translate t
99f0: 68 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75  he P4.pExpr valu
9a00: 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73  e for an OP_Curs
9a10: 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e  orHint opcode in
9a20: 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20  to text.** that 
9a30: 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64  can be displayed
9a40: 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d   in the P4 colum
9a50: 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74  n of EXPLAIN out
9a60: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
9a70: 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45 78 70  oid displayP4Exp
9a80: 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45  r(StrAccum *p, E
9a90: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
9aa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d  onst char *zOp =
9ab0: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
9ac0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
9ad0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
9ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
9af0: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25 51 22  _appendf(p, "%Q"
9b00: 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
9b10: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
9b20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
9b30: 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69  EGER:.      sqli
9b40: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
9b50: 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e  p, "%d", pExpr->
9b60: 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  u.iValue);.     
9b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9b80: 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20   TK_NULL:.      
9b90: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
9ba0: 6e 64 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  ndf(p, "NULL");.
9bb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9bc0: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
9bd0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
9be0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
9bf0: 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72  , "r[%d]", pExpr
9c00: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
9c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9c20: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9c30: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
9c40: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
9c50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9c60: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c  3_str_appendf(p,
9c70: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
9c80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9c90: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
9ca0: 6e 64 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69  ndf(p, "c%d", (i
9cb0: 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  nt)pExpr->iColum
9cc0: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
9cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9ce0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
9cf0: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20      zOp = "LT"; 
9d00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9d10: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
9d20: 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20   zOp = "LE";    
9d30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9d40: 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f  e TK_GT:      zO
9d50: 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62  p = "GT";      b
9d60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9d70: 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_GE:      zOp =
9d80: 20 22 47 45 22 3b 20 20 20 20 20 20 62 72 65 61   "GE";      brea
9d90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
9da0: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e  E:      zOp = "N
9db0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
9dc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
9dd0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b       zOp = "EQ";
9de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9df0: 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20   case TK_IS:    
9e00: 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20    zOp = "IS";   
9e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9e20: 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a  se TK_ISNOT:   z
9e30: 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20  Op = "ISNOT";   
9e40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9e50: 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20  TK_AND:     zOp 
9e60: 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65  = "AND";     bre
9e70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e80: 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  OR:      zOp = "
9e90: 4f 52 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  OR";      break;
9ea0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
9eb0: 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44  S:    zOp = "ADD
9ec0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9ed0: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
9ee0: 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20     zOp = "MUL"; 
9ef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9f00: 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20  ase TK_MINUS:   
9f10: 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20  zOp = "SUB";    
9f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9f30: 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70   TK_REM:     zOp
9f40: 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72   = "REM";     br
9f50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9f60: 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20  _BITAND:  zOp = 
9f70: 22 42 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b  "BITAND";  break
9f80: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
9f90: 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49  TOR:   zOp = "BI
9fa0: 54 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  TOR";   break;. 
9fb0: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
9fc0: 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b  :   zOp = "DIV";
9fd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9fe0: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20  case TK_LSHIFT: 
9ff0: 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b   zOp = "LSHIFT";
a000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a010: 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f  e TK_RSHIFT:  zO
a020: 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62  p = "RSHIFT";  b
a030: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a040: 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d  K_CONCAT:  zOp =
a050: 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61   "CONCAT";  brea
a060: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
a070: 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d  MINUS:  zOp = "M
a080: 49 4e 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a  INUS";   break;.
a090: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
a0a0: 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53  S:   zOp = "PLUS
a0b0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
a0c0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
a0d0: 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22    zOp = "BITNOT"
a0e0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
a0f0: 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a  se TK_NOT:     z
a100: 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20  Op = "NOT";     
a110: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a120: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20  TK_ISNULL:  zOp 
a130: 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65  = "ISNULL";  bre
a140: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a150: 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22  NOTNULL: zOp = "
a160: 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  NOTNULL"; break;
a170: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
a180: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a190: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25 73 22  _appendf(p, "%s"
a1a0: 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20  , "expr");.     
a1b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
a1c0: 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71  f( zOp ){.    sq
a1d0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a1e0: 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29  f(p, "%s(", zOp)
a1f0: 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45  ;.    displayP4E
a200: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c  xpr(p, pExpr->pL
a210: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45  eft);.    if( pE
a220: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
a230: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a240: 5f 61 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20  _append(p, ",", 
a250: 31 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  1);.      displa
a260: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
a270: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
a280: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
a290: 5f 61 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20  _append(p, ")", 
a2a0: 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  1);.  }.}.#endif
a2b0: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
a2c0: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
a2d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
a2e0: 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a  SOR_HINTS) */...
a2f0: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
a300: 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  _P4./*.** Comput
a310: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
a320: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34  describes the P4
a330: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
a340: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
a350: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
a360: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
a370: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
a380: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a390: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f  displayP4(Op *pO
a3a0: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
a3b0: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
a3c0: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b  ar *zP4 = zTemp;
a3d0: 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20  .  StrAccum x;. 
a3e0: 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d   assert( nTemp>=
a3f0: 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  20 );.  sqlite3S
a400: 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20  trAccumInit(&x, 
a410: 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c  0, zTemp, nTemp,
a420: 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70   0);.  switch( p
a430: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
a440: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
a450: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  O: {.      int j
a460: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
a470: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
a480: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
a490: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
a4a0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
a4b0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
a4c0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
a4d0: 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65  (&x, "k(%d", pKe
a4e0: 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
a4f0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
a500: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  ; j<pKeyInfo->nK
a510: 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20  eyField; j++){. 
a520: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
a530: 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
a540: 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  ->aColl[j];.    
a550: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a560: 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20  zColl = pColl ? 
a570: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
a580: 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ";.        if( s
a590: 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49  trcmp(zColl, "BI
a5a0: 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c  NARY")==0 ) zCol
a5b0: 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20  l = "B";.       
a5c0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a5d0: 65 6e 64 66 28 26 78 2c 20 22 2c 25 73 25 73 22  endf(&x, ",%s%s"
a5e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a5f0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
a600: 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20  tOrder[j] ? "-" 
a610: 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  : "", zColl);.  
a620: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a630: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26  te3_str_append(&
a640: 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20  x, ")", 1);.    
a650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a660: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a670: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
a680: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50  .    case P4_EXP
a690: 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c  R: {.      displ
a6a0: 61 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70  ayP4Expr(&x, pOp
a6b0: 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20  ->p4.pExpr);.   
a6c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a6d0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
a6e0: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
a6f0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
a700: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
a710: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
a720: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
a730: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
a740: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
a750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a760: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
a770: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
a780: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
a790: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
a7a0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a7b0: 65 6e 64 66 28 26 78 2c 20 22 25 73 28 25 64 29  endf(&x, "%s(%d)
a7c0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
a7d0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
a7e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a7f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
a800: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
a810: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
a820: 45 29 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46  E).    case P4_F
a830: 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20  UNCCTX: {.      
a840: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
a850: 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46  pOp->p4.pCtx->pF
a860: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
a870: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
a880: 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  x, "%s(%d)", pDe
a890: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
a8a0: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
a8b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
a8c0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
a8d0: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
a8e0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a8f0: 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  &x, "%lld", *pOp
a900: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
a910: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a920: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
a930: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a940: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
a950: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
a960: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
a970: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a980: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
a990: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a9a0: 65 6e 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22  endf(&x, "%.16g"
a9b0: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  , *pOp->p4.pReal
a9c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a9d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
a9e0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  4_MEM: {.      M
a9f0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e  em *pMem = pOp->
aa00: 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  p4.pMem;.      i
aa10: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
aa20: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
aa30: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
aa40: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
aa50: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
aa60: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
aa70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
aa80: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 6c 6c  appendf(&x, "%ll
aa90: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
aaa0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
aab0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
aac0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
aad0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
aae0: 70 65 6e 64 66 28 26 78 2c 20 22 25 2e 31 36 67  pendf(&x, "%.16g
aaf0: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20  ", pMem->u.r);. 
ab00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
ab10: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
ab20: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Null ){.       
ab30: 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20   zP4 = "NULL";. 
ab40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ab50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
ab60: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
ab70: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
ab80: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
ab90: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
aba0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
abb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
abc0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
abd0: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
abe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
abf0: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
ac00: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
ac10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
ac20: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 76  r_appendf(&x, "v
ac30: 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b  tab:%p", pVtab);
ac40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ac50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
ac60: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
ac70: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
ac80: 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20        int *ai = 
ac90: 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20  pOp->p4.ai;.    
aca0: 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b    int n = ai[0];
acb0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
acc0: 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e  element of an IN
acd0: 54 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73  TARRAY is always
ace0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
ad00: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
ad10: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74  er of elements t
ad20: 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
ad30: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b    for(i=1; i<=n;
ad40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
ad50: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
ad60: 64 66 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69  df(&x, ",%d", ai
ad70: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
ad80: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27      zTemp[0] = '
ad90: 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  [';.      sqlite
ada0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c  3_str_append(&x,
adb0: 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   "]", 1);.      
adc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
add0: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
ade0: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
adf0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
ae00: 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b  (&x, "program");
ae10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ae20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
ae30: 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73  DYNBLOB:.    cas
ae40: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
ae50: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
ae60: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
ae70: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ae80: 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20  P4_TABLE: {.    
ae90: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
aea0: 70 65 6e 64 66 28 26 78 2c 20 22 25 73 22 2c 20  pendf(&x, "%s", 
aeb0: 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e  pOp->p4.pTab->zN
aec0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
aed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
aee0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
aef0: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
af00: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
af10: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
af20: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
af30: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
af40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
af50: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
af60: 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61  mFinish(&x);.  a
af70: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
af80: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
af90: 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f  .#endif /* VDBE_
afa0: 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f  DISPLAY_P4 */../
afb0: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20  *.** Declare to 
afc0: 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68  the Vdbe that th
afd0: 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61  e BTree object a
afe0: 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20  t db->aDb[i] is 
aff0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
b000: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
b010: 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  nts need to know
b020: 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20   in advance the 
b030: 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a  complete set of.
b040: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
b050: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
b060: 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20  be use.  A mask 
b070: 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73  of these databas
b080: 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69  es.** is maintai
b090: 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  ned in p->btreeM
b0a0: 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63  ask.  The p->loc
b0b0: 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74  kMask value is t
b0c0: 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  he subset of.** 
b0d0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20  p->btreeMask of 
b0e0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
b0f0: 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f  ill require a lo
b100: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
b110: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
b120: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29  (Vdbe *p, int i)
b130: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  {.  assert( i>=0
b140: 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62   && i<p->db->nDb
b150: 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f   && i<(int)sizeo
b160: 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a  f(yDbMask)*8 );.
b170: 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74    assert( i<(int
b180: 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65  )sizeof(p->btree
b190: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d  Mask)*8 );.  DbM
b1a0: 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d  askSet(p->btreeM
b1b0: 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69  ask, i);.  if( i
b1c0: 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74  !=1 && sqlite3Bt
b1d0: 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64  reeSharable(p->d
b1e0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
b1f0: 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
b200: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b  p->lockMask, i);
b210: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
b220: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b230: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f  _SHARED_CACHE)./
b240: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
b250: 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75  s compiled to su
b260: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
b270: 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62  he mode and to b
b280: 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a  e threadsafe,.**
b290: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62   this routine ob
b2a0: 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20  tains the mutex 
b2b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b2c0: 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74  each BtShared st
b2d0: 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20  ructure.** that 
b2e0: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
b2f0: 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
b300: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
b310: 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20   In doing so it 
b320: 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65  also.** sets the
b330: 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d   BtShared.db mem
b340: 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74  ber of each of t
b350: 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
b360: 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67  ctures, ensuring
b370: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72  .** that the cor
b380: 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65  rect busy-handle
b390: 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  r callback is in
b3a0: 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65  voked if require
b3b0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  d..**.** If SQLi
b3c0: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
b3d0: 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75  safe but does su
b3e0: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
b3f0: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a  he mode, then.**
b400: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
b410: 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20  er() is invoked 
b420: 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61  to set the BtSha
b430: 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73  red.db variables
b440: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74  .** of all of Bt
b450: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
b460: 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61  s accessible via
b470: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
b480: 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61  ndle .** associa
b490: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e  ted with the VM.
b4a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
b4b0: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
b4c0: 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  fe and does not 
b4d0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
b4e0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a  ache mode, this.
b4f0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
b500: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
b510: 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66  e p->btreeMask f
b520: 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73  ield is a bitmas
b530: 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20  k of all btrees 
b540: 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65  that the prepare
b550: 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  d .** statement 
b560: 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e  p will ever use.
b570: 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e    Let N be the n
b580: 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e  umber of bits in
b590: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a   p->btreeMask.**
b5a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
b5b0: 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73  o btrees that us
b5c0: 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20  e shared cache. 
b5d0: 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d   Then the runtim
b5e0: 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75  e of.** this rou
b5f0: 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75  tine is N*N.  Bu
b600: 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79  t as N is rarely
b610: 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68   more than 1, th
b620: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  is should not.**
b630: 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a   be a problem..*
b640: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b650: 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29  beEnter(Vdbe *p)
b660: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
b670: 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
b680: 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a  aDb;.  int nDb;.
b690: 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a    if( DbMaskAllZ
b6a0: 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  ero(p->lockMask)
b6b0: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
b6c0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
b6d0: 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  /.  db = p->db;.
b6e0: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
b6f0: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
b700: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
b710: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
b720: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
b730: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
b740: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
b750: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
b760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
b770: 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70  eeEnter(aDb[i].p
b780: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
b790: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
b7a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b7b0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
b7c0: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
b7d0: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c  SAFE>0./*.** Unl
b7e0: 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62  ock all of the b
b7f0: 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79  trees previously
b800: 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c   locked by a cal
b810: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
b820: 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74  Enter()..*/.stat
b830: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
b840: 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76  NE void vdbeLeav
b850: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
b860: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
b870: 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20  db;.  Db *aDb;. 
b880: 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d   int nDb;.  db =
b890: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
b8a0: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
b8b0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
b8c0: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
b8d0: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
b8e0: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
b8f0: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
b900: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
b910: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
b920: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
b930: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
b940: 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71   }.  }.}.void sq
b950: 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56  lite3VdbeLeave(V
b960: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44  dbe *p){.  if( D
b970: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
b980: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75  lockMask) ) retu
b990: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
b9a0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62  on case */.  vdb
b9b0: 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e  eLeave(p);.}.#en
b9c0: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
b9d0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
b9e0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
b9f0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
ba00: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
ba10: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
ba20: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
ba30: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
ba40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
ba50: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
ba60: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
ba70: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
ba80: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
ba90: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f  [50];.  char zCo
baa0: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63  m[100];.  static
bab0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
bac0: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
bad0: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
bae0: 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  -13s %.2X %s\n";
baf0: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
bb00: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
bb10: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
bb20: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
bb30: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64  eof(zPtr));.#ifd
bb40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
bb50: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
bb60: 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  S.  displayComme
bb70: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f  nt(pOp, zP4, zCo
bb80: 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29  m, sizeof(zCom))
bb90: 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30  ;.#else.  zCom[0
bba0: 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  ] = 0;.#endif.  
bbb0: 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69  /* NB:  The sqli
bbc0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20  te3OpcodeName() 
bbd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
bbe0: 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20  emented by code 
bbf0: 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20  created.  ** by 
bc00: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
bc10: 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e  k and mkopcodec.
bc20: 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63  awk scripts whic
bc30: 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20  h extract the.  
bc40: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
bc50: 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73  rom the vdbe.c s
bc60: 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20  ource text */.  
bc70: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
bc80: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
bc90: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
bca0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
bcb0: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
bcc0: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
bcd0: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20  4, pOp->p5,.    
bce0: 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66    zCom.  );.  ff
bcf0: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
bd00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
bd10: 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20  ialize an array 
bd20: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
bd30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bd40: 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65   initMemArray(Me
bd50: 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c  m *p, int N, sql
bd60: 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c  ite3 *db, u16 fl
bd70: 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28  ags){.  while( (
bd80: 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d  N--)>0 ){.    p-
bd90: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
bda0: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
bdb0: 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20      p->szMalloc 
bdc0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
bdd0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e  TE_DEBUG.    p->
bde0: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
bdf0: 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a  #endif.    p++;.
be00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
be10: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
be20: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
be30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
be40: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
be50: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
be60: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
be70: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26     Mem *pEnd = &
be80: 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  p[N];.    sqlite
be90: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
bea0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
beb0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
bec0: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
bed0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
bee0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
bef0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
bf00: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
bf10: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
bf20: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
bf30: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
bf40: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
bf50: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
bf60: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
bf70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
bf80: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
bf90: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
bfa0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
bfb0: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
bfc0: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
bfd0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
bfe0: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
bff0: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
c000: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
c010: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
c020: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
c030: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
c040: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
c050: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
c060: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
c070: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
c080: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
c090: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
c0a0: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
c0b0: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
c0c0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
c0d0: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
c0e0: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
c0f0: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
c100: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
c110: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
c120: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
c130: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
c140: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
c150: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
c160: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
c170: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
c180: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
c190: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
c1a0: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
c1b0: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
c1c0: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
c1d0: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
c1e0: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
c1f0: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
c200: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
c210: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
c220: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
c230: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
c240: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
c250: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
c260: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
c270: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
c280: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
c290: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
c2a0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
c2b0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
c2c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c2d0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
c2e0: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
c2f0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
c300: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
c310: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
c320: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
c330: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
c340: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
c350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c360: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
c370: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c380: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
c390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
c3a0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d  FreeNN(db, p->zM
c3b0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
c3c0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
c3d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c3e0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
c3f0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
c400: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
c410: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
c420: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
c430: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
c440: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
c450: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
c460: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
c470: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
c480: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
c490: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
c4a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c4b0: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
c4c0: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
c4d0: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
c4e0: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
c4f0: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
c500: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
c510: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
c520: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
c530: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c540: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
c550: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c560: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
c570: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
c580: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
c590: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
c5a0: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
c5b0: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
c5c0: 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e  a(p->v->db, &p->
c5d0: 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
c5e0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
c5f0: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
c600: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
c610: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
c620: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
c630: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
c640: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
c650: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
c660: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
c670: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
c680: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
c690: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
c6a0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
c6b0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
c6c0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
c6d0: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
c6e0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
c6f0: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
c700: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
c710: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
c720: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
c730: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
c740: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
c750: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
c760: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
c770: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
c780: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
c790: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
c7a0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
c7b0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
c7c0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
c7d0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
c7e0: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
c7f0: 59 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d  Y PLAN..** 2018-
c800: 30 34 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78  04-24:  In p->ex
c810: 70 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74  plain==2 mode, t
c820: 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64  he OP_Init opcod
c830: 65 73 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a  es of triggers.*
c840: 2a 20 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e  * are also shown
c850: 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f  , so that the bo
c860: 75 6e 64 61 72 69 65 73 20 62 65 74 77 65 65 6e  undaries between
c870: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
c880: 6d 20 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72  m and.** each tr
c890: 69 67 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e  igger are clear.
c8a0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
c8b0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
c8c0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
c8d0: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
c8e0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
c8f0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
c900: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
c910: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
c920: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
c930: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
c960: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
c990: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
c9a0: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
c9b0: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c9e0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
c9f0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
ca00: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
ca10: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
ca20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
ca30: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
ca40: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
ca70: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
ca80: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
ca90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
caa0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
cab0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
cac0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
cad0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
cb00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
cb10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cb30: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
cb40: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
cb50: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
cb70: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
cb80: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  lt set */.  int 
cb90: 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20  bListSubprogs = 
cba0: 28 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c  (p->explain==1 |
cbb0: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  | (db->flags & S
cbc0: 51 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51 50  QLITE_TriggerEQP
cbd0: 29 21 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70  )!=0);.  Op *pOp
cbe0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
cbf0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
cc00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
cc10: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
cc20: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
cc30: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
cc40: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
cc50: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
cc60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
cc70: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
cc80: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
cc90: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
cca0: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
ccb0: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
ccc0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
ccd0: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
cce0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
ccf0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
cd00: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
cd10: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
cd20: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
cd30: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
cd40: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
cd50: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70  ay(pMem, 8);.  p
cd60: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
cd70: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
cd80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
cd90: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
cda0: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
cdb0: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
cdc0: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
cdd0: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
cde0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
cdf0: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
ce00: 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  d.  */.    sqlit
ce10: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
ce20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce30: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
ce40: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
ce50: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
ce60: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
ce70: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
ce80: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
ce90: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
cea0: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
ceb0: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
cec0: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
ced0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
cee0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
cef0: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
cf00: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
cf10: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
cf20: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
cf30: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
cf40: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
cf50: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
cf60: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
cf70: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
cf80: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
cf90: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
cfa0: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
cfb0: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
cfc0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
cfd0: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
cfe0: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
cff0: 4f 70 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53  Op;.  if( bListS
d000: 75 62 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f  ubprogs ){.    /
d010: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
d020: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
d030: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
d040: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
d050: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
d060: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
d070: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
d080: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
d090: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
d0a0: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
d0b0: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
d0c0: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
d0d0: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
d0e0: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
d0f0: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
d100: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
d110: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
d120: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
d130: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
d140: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
d150: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
d160: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
d170: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
d180: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
d190: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
d1a0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
d1b0: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
d1c0: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
d1d0: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
d1e0: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
d1f0: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
d200: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
d210: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
d220: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
d230: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
d240: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
d250: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
d260: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
d270: 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28   }.  }..  while(
d280: 31 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69  1){  /* Loop exi
d290: 74 73 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a  ts via break */.
d2a0: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
d2b0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  .    if( i>=nRow
d2c0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
d2d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d2e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
d2f0: 4f 4e 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ONE;.      break
d300: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d310: 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  i<p->nOp ){.    
d320: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
d330: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73  line number is s
d340: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74  mall enough that
d350: 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e   we are still in
d360: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61   the.      ** ma
d370: 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  in program. */. 
d380: 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61       pOp = &p->a
d390: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  Op[i];.    }else
d3a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72  {.      /* We ar
d3b0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74  e currently list
d3c0: 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ing subprograms.
d3d0: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
d3e0: 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20  ch one and.     
d3f0: 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20   ** pick up the 
d400: 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f  appropriate opco
d410: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  de. */.      int
d420: 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70   j;.      i -= p
d430: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72  ->nOp;.      for
d440: 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a  (j=0; i>=apSub[j
d450: 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20  ]->nOp; j++){.  
d460: 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62        i -= apSub
d470: 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  [j]->nOp;.      
d480: 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61  }.      pOp = &a
d490: 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b  pSub[j]->aOp[i];
d4a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57  .    }..    /* W
d4b0: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
d4c0: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
d4d0: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
d4e0: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
d4f0: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
d500: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
d510: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
d520: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
d530: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
d540: 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e    ** kept in p->
d550: 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c  aMem[9].z to hol
d560: 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61  d the new progra
d570: 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69  m - assuming thi
d580: 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20  s subprogram.   
d590: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
d5a0: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
d5b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c     */.    if( bL
d5c0: 69 73 74 53 75 62 70 72 6f 67 73 20 26 26 20 70  istSubprogs && p
d5d0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
d5e0: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
d5f0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
d600: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
d610: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
d620: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
d630: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
d640: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
d650: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70  f( apSub[j]==pOp
d660: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
d670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d680: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
d690: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
d6a0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
d6b0: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
d6c0: 74 65 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20  te, nSub!=0);.  
d6d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21        if( p->rc!
d6e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d6f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
d700: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
d710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d720: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70      }.        ap
d730: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
d740: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
d750: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
d760: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
d770: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
d780: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
d790: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
d7a0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
d7b0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
d7c0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f  m*);.        nRo
d7d0: 77 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  w += pOp->p4.pPr
d7e0: 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ogram->nOp;.    
d7f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
d800: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29  ( p->explain<2 )
d810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
d820: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
d830: 45 78 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b  Explain ) break;
d840: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
d850: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
d860: 20 70 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b   p->pc>1 ) break
d870: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
d880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d890: 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49    if( db->u1.isI
d8a0: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
d8b0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
d8c0: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
d8d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d8e0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
d8f0: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
d900: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
d910: 2d 3e 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ->rc));.    }els
d920: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
d930: 50 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  P4;.      if( p-
d940: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
d950: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
d960: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
d970: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
d980: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
d9b0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
d9c0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20    pMem++;.    . 
d9d0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
d9e0: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
d9f0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
da00: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
da10: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
da20: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
da30: 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70  ->opcode); /* Op
da40: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
da50: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
da60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  =0 );.        pM
da70: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
da80: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
da90: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
daa0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
dab0: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b  8;.        pMem+
dac0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  +;.      }..    
dad0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
dae0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
daf0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
db00: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db20: 50 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P1 */.      pMem
db30: 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ++;..      pMem-
db40: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
db50: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
db60: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db80: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
db90: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
dba0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
dbb0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
dbc0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
dbd0: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbf0: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P3 */.      pM
dc00: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28  em++;..      if(
dc10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
dc20: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
dc30: 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50  em, 100) ){ /* P
dc40: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  4 */.        ass
dc50: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
dc60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
dc70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dc80: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
dc90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
dca0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
dcb0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34  _Term;.      zP4
dcc0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
dcd0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d  , pMem->z, pMem-
dce0: 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  >szMalloc);.    
dcf0: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
dd00: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  >z ){.        pM
dd10: 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
dd20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
dd30: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50  mSetStr(pMem, zP
dd40: 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  4, -1, SQLITE_UT
dd50: 46 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  F8, 0);.      }e
dd60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
dd70: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
dd80: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
dd90: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
dda0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
ddb0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
ddc0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ddd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
dde0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28  em++;..      if(
ddf0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
de00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
de10: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
de20: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
de30: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   4) ){.         
de40: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
de50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
de60: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
de70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
de80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de90: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
dea0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
deb0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
dec0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71   = 2;.        sq
ded0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
dee0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78  , pMem->z, "%.2x
def0: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
df00: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P5 */.        
df10: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
df20: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
df30: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69   pMem++;.    .#i
df40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
df50: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
df60: 4e 54 53 0a 20 20 20 20 20 20 20 20 69 66 28 20  NTS.        if( 
df70: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
df80: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
df90: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
dfa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
dfb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dfc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
dfd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
dfe0: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
dff0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e000: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
e010: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
e020: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
e030: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
e040: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
e050: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
e060: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
e070: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d  #else.        pM
e080: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e090: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
e0b0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  omment */.#endif
e0c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e0d0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
e0e0: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
e0f0: 6e 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  n-1);.      p->p
e100: 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e  ResultSet = &p->
e110: 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70  aMem[1];.      p
e120: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
e130: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
e140: 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20  ITE_ROW;.    }. 
e150: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
e160: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e170: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
e180: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
e190: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
e1a0: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
e1b0: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
e1c0: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
e1d0: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
e1e0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
e1f0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f  l(Vdbe *p){.  co
e200: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
e210: 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29  .  if( p->zSql )
e220: 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71  {.    z = p->zSq
e230: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
e240: 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20  ->nOp>=1 ){.    
e250: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f  const VdbeOp *pO
e260: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
e270: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
e280: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
e290: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
e2a0: 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70        z = pOp->p
e2b0: 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  4.z;.      while
e2c0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
e2d0: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
e2e0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20  }.  }.  if( z ) 
e2f0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
e300: 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64  ]\n", z);.}.#end
e310: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
e320: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
e330: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
e340: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
e350: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
e360: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
e370: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
e380: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
e390: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
e3a0: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
e3b0: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
e3c0: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
e3d0: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
e3e0: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
e3f0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
e400: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
e410: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
e420: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
e430: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
e440: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
e450: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
e460: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
e470: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
e480: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
e490: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
e4a0: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
e4b0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
e4c0: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
e4d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
e4e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e4f0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
e500: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
e510: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
e520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
e530: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
e540: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
e550: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
e560: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
e570: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
e580: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
e590: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
e5a0: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
e5b0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
e5c0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
e5d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
e5e0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69  RACE */../* An i
e5f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
e600: 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73  object describes
e610: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61   bulk memory ava
e620: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a  ilable for use.*
e630: 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e  * by subcomponen
e640: 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64  ts of a prepared
e650: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61   statement.  Spa
e660: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ce is allocated 
e670: 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73  out.** of a Reus
e680: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
e690: 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61   by the allocSpa
e6a0: 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c  ce() routine bel
e6b0: 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65  ow..*/.struct Re
e6c0: 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20  usableSpace {.  
e6d0: 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  u8 *pSpace;     
e6e0: 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c       /* Availabl
e6f0: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  e memory */.  in
e700: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
e710: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61     /* Bytes of a
e720: 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20  vailable memory 
e730: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64  */.  int nNeeded
e740: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74  ;         /* Tot
e750: 61 6c 20 62 79 74 65 73 20 74 68 61 74 20 63 6f  al bytes that co
e760: 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63  uld not be alloc
e770: 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  ated */.};../* T
e780: 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e  ry to allocate n
e790: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d  Byte bytes of 8-
e7a0: 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c  byte aligned bul
e7b0: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75  k memory for pBu
e7c0: 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65  f.** from the Re
e7d0: 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65  usableSpace obje
e7e0: 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ct.  Return a po
e7f0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
e800: 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79  ocated.** memory
e810: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
e820: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65   insufficient me
e830: 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  mory is availabl
e840: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73  e in the.** Reus
e850: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
e860: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 52  , increase the R
e870: 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65  eusableSpace.nNe
e880: 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79  eded.** value by
e890: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64   the amount need
e8a0: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  ed and return NU
e8b0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  LL..**.** If pBu
e8c0: 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  f is not initial
e8d0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65  ly NULL, that me
e8e0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d  ans that the mem
e8f0: 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ory has already.
e900: 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
e910: 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c  d by a prior cal
e920: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
e930: 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  e, so just retur
e940: 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70  n a copy.** of p
e950: 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65  Buf and leave Re
e960: 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68  usableSpace unch
e970: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anged..**.** Thi
e980: 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65  s allocator is e
e990: 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72  mployed to repur
e9a0: 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74  pose unused slot
e9b0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
e9c0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72  the.** opcode ar
e9d0: 72 61 79 20 6f 66 20 70 72 65 70 61 72 65 64 20  ray of prepared 
e9e0: 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20  state for other 
e9f0: 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20  memory needs of 
ea00: 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  the prepared.** 
ea10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
ea20: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
ea30: 53 70 61 63 65 28 0a 20 20 73 74 72 75 63 74 20  Space(.  struct 
ea40: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70  ReusableSpace *p
ea50: 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72  ,  /* Bulk memor
ea60: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
ea70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
ea80: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
ea90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
eaa0: 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20  nter to a prior 
eab0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
eac0: 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20  int nByte       
ead0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
eae0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65  es of memory nee
eaf0: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ded */.){.  asse
eb00: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
eb10: 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61  LIGNMENT(p->pSpa
eb20: 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  ce) );.  if( pBu
eb30: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  f==0 ){.    nByt
eb40: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
eb50: 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
eb60: 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a   <= p->nFree ){.
eb70: 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d        p->nFree -
eb80: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70  = nByte;.      p
eb90: 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65  Buf = &p->pSpace
eba0: 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20  [p->nFree];.    
ebb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
ebc0: 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65  nNeeded += nByte
ebd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
ebe0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
ebf0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29  _ALIGNMENT(pBuf)
ec00: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75   );.  return pBu
ec10: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69  f;.}../*.** Rewi
ec20: 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b  nd the VDBE back
ec30: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
ec40: 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  g in preparation
ec50: 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20   for.** running 
ec60: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
ec70: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64  te3VdbeRewind(Vd
ec80: 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
ec90: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
eca0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
ecb0: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
ecc0: 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   i;.#endif.  ass
ecd0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
ece0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
ecf0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
ed00: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
ed10: 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29  BE_MAGIC_RESET )
ed20: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
ed30: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
ed40: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
ed50: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
ed60: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
ed70: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
ed80: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
ed90: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
eda0: 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e   later. */.  p->
edb0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
edc0: 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20  IC_RUN;..#ifdef 
edd0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
ede0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=0; i<p->nMe
edf0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; i++){.    ass
ee00: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
ee10: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
ee20: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20  .#endif.  p->pc 
ee30: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
ee40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
ee50: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
ee60: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68  _Abort;.  p->nCh
ee70: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
ee80: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
ee90: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
eea0: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
eeb0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
eec0: 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  .  p->nFkConstra
eed0: 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  int = 0;.#ifdef 
eee0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66  VDBE_PROFILE.  f
eef0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
ef00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; i++){.    p->a
ef10: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
ef20: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
ef30: 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  les = 0;.  }.#en
ef40: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
ef50: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
ef60: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
ef70: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72  tion for the fir
ef80: 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a  st time after.**
ef90: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69   creating the vi
efa0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
efb0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
efc0: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
efd0: 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73  allocating regis
efe0: 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c  ters and initial
eff0: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
f000: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
f010: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
f020: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
f030: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
f040: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
f050: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
f060: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
f070: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
f080: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
f090: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f  d exactly once o
f0a0: 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d  n each virtual m
f0b0: 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72  achine..** After
f0c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f0d0: 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68   called the VM h
f0e0: 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65  as been "package
f0f0: 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a  d" and is ready.
f100: 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65  ** to run.  Afte
f110: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
f120: 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65  s called, furthe
f130: 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  r calls to .** s
f140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f150: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ) functions are 
f160: 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69  prohibited.  Thi
f170: 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e  s routine discon
f180: 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62  nects.** the Vdb
f190: 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65  e from the Parse
f1a0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c   object that hel
f1b0: 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20  ped generate it 
f1c0: 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  so that the.** t
f1d0: 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20  he Vdbe becomes 
f1e0: 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65  an independent e
f1f0: 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61  ntity and the Pa
f200: 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  rse object can b
f210: 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a  e.** destroyed..
f220: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
f230: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
f240: 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72  ) procedure to r
f250: 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c  estore a virtual
f260: 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a   machine back.**
f270: 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20   to its initial 
f280: 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68  state after it h
f290: 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a  as been run..*/.
f2a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
f2b0: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
f2c0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f2e0: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72  he VDBE */.  Par
f2f0: 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20  se *pParse      
f300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f310: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
f320: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
f330: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
f340: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
f350: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
f360: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20   */.  int nVar; 
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f390: 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  f parameters */.
f3a0: 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d   /* Number of VM
f3d0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
f3e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  s */.  int nCurs
f3f0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
f400: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f410: 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  of cursors requi
f420: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  red */.  int nAr
f430: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
f440: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f450: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
f460: 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  n subprograms */
f470: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
f4a0: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65  r */.  struct Re
f4b0: 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20  usableSpace x;  
f4c0: 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c        /* Reusabl
f4d0: 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f  e bulk memory */
f4e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
f4f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
f500: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
f510: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
f520: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
f530: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
f540: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
f550: 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61  ( pParse==p->pPa
f560: 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  rse );.  db = p-
f570: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
f580: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
f590: 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70  =0 );.  nVar = p
f5a0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e  Parse->nVar;.  n
f5b0: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
f5c0: 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20  em;.  nCursor = 
f5d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
f5e0: 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nArg = pParse->n
f5f0: 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20  MaxArg;.  .  /* 
f600: 45 61 63 68 20 63 75 72 73 6f 72 20 75 73 65 73  Each cursor uses
f610: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
f620: 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   The first curso
f630: 72 20 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e  r (cursor 0) can
f640: 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30  .  ** use aMem[0
f650: 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f  ] which is not o
f660: 74 68 65 72 77 69 73 65 20 75 73 65 64 20 62 79  therwise used by
f670: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
f680: 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a  m.  Allocate.  *
f690: 2a 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  * space at the e
f6a0: 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72  nd of aMem[] for
f6b0: 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67   cursors 1 and g
f6c0: 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65  reater..  ** See
f6d0: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
f6e0: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
f6f0: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
f700: 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d  .  if( nCursor==
f710: 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d  0 && nMem>0 ) nM
f720: 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20  em++;  /* Space 
f730: 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e  for aMem[0] even
f740: 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a   if not used */.
f750: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
f760: 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62   how much reusab
f770: 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  le memory is ava
f780: 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e  ilable at the en
f790: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70  d of the.  ** op
f7a0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69  code array.  Thi
f7b0: 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77  s extra memory w
f7c0: 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ill be reallocat
f7d0: 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65  ed for other ele
f7e0: 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  ments.  ** of th
f7f0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
f800: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d  ment..  */.  n =
f810: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f   ROUND8(sizeof(O
f820: 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20  p)*p->nOp);     
f830: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
f840: 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f  s of opcode memo
f850: 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70  ry used */.  x.p
f860: 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70  Space = &((u8*)p
f870: 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20  ->aOp)[n];      
f880: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
f890: 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  ed opcode memory
f8a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49   */.  assert( EI
f8b0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
f8c0: 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a  NT(x.pSpace) );.
f8d0: 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e    x.nFree = ROUN
f8e0: 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73  DDOWN8(pParse->s
f8f0: 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20  zOpAlloc - n);  
f900: 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73  /* Bytes of unus
f910: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  ed memory */.  a
f920: 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d  ssert( x.nFree>=
f930: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  0 );.  assert( E
f940: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
f950: 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e  ENT(&x.pSpace[x.
f960: 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65  nFree]) );..  re
f970: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
f980: 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73   &nArg);.  p->us
f990: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20  esStmtJournal = 
f9a0: 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d  (u8)(pParse->isM
f9b0: 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61  ultiWrite && pPa
f9c0: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a  rse->mayAbort);.
f9d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
f9e0: 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30  plain && nMem<10
f9f0: 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31   ){.    nMem = 1
fa00: 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69  0;.  }.  p->expi
fa10: 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  red = 0;..  /* M
fa20: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
fa30: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
fa40: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
fa50: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e   allocated in on
fa60: 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61  e or two.  ** pa
fa70: 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69  sses.  On the fi
fa80: 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79  rst pass, we try
fa90: 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64   to reuse unused
faa0: 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a   memory at the .
fab0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
fac0: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
fad0: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
fae0: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
faf0: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
fb00: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
fb10: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
fb20: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
fb30: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
fb40: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
fb50: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75   the remainder u
fb60: 73 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d  sing a fresh mem
fb70: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  ory allocation. 
fb80: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
fb90: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
fba0: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
fbb0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
fbc0: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
fbd0: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
fbe0: 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65   memory at the e
fbf0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
fc00: 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 63 61   array.  This ca
fc10: 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
fc20: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
fc30: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
fc40: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
fc50: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
fc60: 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78   */.  do {.    x
fc70: 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  .nNeeded = 0;.  
fc80: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
fc90: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d  cSpace(&x, p->aM
fca0: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
fcb0: 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56  Mem));.    p->aV
fcc0: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
fcd0: 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61  &x, p->aVar, nVa
fce0: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  r*sizeof(Mem));.
fcf0: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
fd00: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
fd10: 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a  >apArg, nArg*siz
fd20: 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20  eof(Mem*));.    
fd30: 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63  p->apCsr = alloc
fd40: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43  Space(&x, p->apC
fd50: 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65  sr, nCursor*size
fd60: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29  of(VdbeCursor*))
fd70: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fd80: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
fd90: 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e  STATUS.    p->an
fda0: 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
fdb0: 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c  e(&x, p->anExec,
fdc0: 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
fdd0: 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  64));.#endif.   
fde0: 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d   if( x.nNeeded==
fdf0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78  0 ) break;.    x
fe00: 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72  .pSpace = p->pFr
fe10: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
fe20: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e  llocRawNN(db, x.
fe30: 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e  nNeeded);.    x.
fe40: 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65  nFree = x.nNeede
fe50: 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62  d;.  }while( !db
fe60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fe70: 3b 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d  ;..  p->pVList =
fe80: 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b   pParse->pVList;
fe90: 0a 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  .  pParse->pVLis
fea0: 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70  t =  0;.  p->exp
feb0: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
fec0: 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62  xplain;.  if( db
fed0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fee0: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
fef0: 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  0;.    p->nCurso
ff00: 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d  r = 0;.    p->nM
ff10: 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  em = 0;.  }else{
ff20: 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
ff30: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  = nCursor;.    p
ff40: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
ff50: 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65  nVar;.    initMe
ff60: 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
ff70: 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75  nVar, db, MEM_Nu
ff80: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  ll);.    p->nMem
ff90: 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69   = nMem;.    ini
ffa0: 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  tMemArray(p->aMe
ffb0: 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d  m, nMem, db, MEM
ffc0: 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20  _Undefined);.   
ffd0: 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72   memset(p->apCsr
ffe0: 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  , 0, nCursor*siz
fff0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
10000 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
10010 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
10020 4e 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73  NSTATUS.    mems
10030 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c  et(p->anExec, 0,
10040 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
10050 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  64));.#endif.  }
10060 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
10070 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
10080 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
10090 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
100a0 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
100b0 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
100c0 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
100d0 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
100e0 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
100f0 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
10100 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
10110 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
10120 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
10130 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74  assert( pCx->pBt
10140 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75  x==0 || pCx->eCu
10150 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
10160 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68  TREE );.  switch
10170 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20  ( pCx->eCurType 
10180 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  ){.    case CURT
10190 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20  YPE_SORTER: {.  
101a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
101b0 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
101c0 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72  , pCx);.      br
101d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
101e0 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45  ase CURTYPE_BTRE
101f0 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E: {.      if( p
10200 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20  Cx->isEphemeral 
10210 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10220 43 78 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74  Cx->pBtx ) sqlit
10230 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
10240 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20  ->pBtx);.       
10250 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
10260 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
10270 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
10280 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
10290 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  by.        ** th
102a0 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f  e call above. */
102b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
102c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
102d0 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  x->uc.pCursor!=0
102e0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
102f0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
10300 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72  sor(pCx->uc.pCur
10310 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
10320 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10330 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10340 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10350 45 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  E.    case CURTY
10360 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  PE_VTAB: {.     
10370 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
10380 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43  rsor *pVCur = pC
10390 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20  x->uc.pVCur;.   
103a0 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
103b0 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
103c0 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d   = pVCur->pVtab-
103d0 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20  >pModule;.      
103e0 61 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70  assert( pVCur->p
103f0 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Vtab->nRef>0 );.
10400 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74        pVCur->pVt
10410 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ab->nRef--;.    
10420 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
10430 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20  e(pVCur);.      
10440 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
10450 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
10460 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
10470 72 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  rs in the curren
10480 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  t frame..*/.stat
10490 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72  ic void closeCur
104a0 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65  sorsInFrame(Vdbe
104b0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
104c0 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
104d0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
104e0 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
104f0 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75  +){.      VdbeCu
10500 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
10510 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Csr[i];.      if
10520 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pC ){.        
10530 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
10540 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
10550 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
10560 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
10570 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
10580 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
10590 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
105a0 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74  VdbeFrame struct
105b0 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e  ure to its Vdbe.
105c0 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64   This.** is used
105d0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
105e0 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75  hen a trigger su
105f0 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c  b-program is hal
10600 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a  ted to restore.*
10610 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  * control to the
10620 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a   main program..*
10630 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
10640 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64  eFrameRestore(Vd
10650 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
10660 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46  {.  Vdbe *v = pF
10670 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65  rame->v;.  close
10680 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76  CursorsInFrame(v
10690 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
106a0 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
106b0 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45  NSTATUS.  v->anE
106c0 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e  xec = pFrame->an
106d0 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76  Exec;.#endif.  v
106e0 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
106f0 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
10700 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
10710 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
10720 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
10730 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
10740 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
10750 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
10760 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
10770 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
10780 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
10790 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
107a0 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
107b0 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
107c0 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43  nge;.  v->db->nC
107d0 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
107e0 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c  nDbChange;.  sql
107f0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
10800 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d  xData(v->db, &v-
10810 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
10820 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61  );.  v->pAuxData
10830 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44   = pFrame->pAuxD
10840 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70  ata;.  pFrame->p
10850 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72  AuxData = 0;.  r
10860 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
10870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10880 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
10890 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
108a0 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
108b0 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
108c0 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
108d0 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
108e0 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
108f0 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
10900 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
10910 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
10920 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
10930 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
10940 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
10950 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
10960 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
10970 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
10980 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
10990 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
109a0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
109b0 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
109c0 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
109d0 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
109e0 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
109f0 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
10a00 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
10a10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10a20 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
10a30 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  rame);.    p->pF
10a40 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rame = 0;.    p-
10a50 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  >nFrame = 0;.  }
10a60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46  .  assert( p->nF
10a70 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f  rame==0 );.  clo
10a80 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
10a90 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  (p);.  if( p->aM
10aa0 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
10ab0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  eMemArray(p->aMe
10ac0 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  m, p->nMem);.  }
10ad0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
10ae0 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
10af0 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
10b00 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
10b10 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
10b20 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
10b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
10b40 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
10b50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
10b60 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
10b70 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
10b80 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69  by the VM */.  i
10b90 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29  f( p->pAuxData )
10ba0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
10bb0 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c  teAuxData(p->db,
10bc0 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &p->pAuxData, -
10bd0 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
10be0 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20   p->pAuxData==0 
10bf0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
10c00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
10c10 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
10c20 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
10c30 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
10c40 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
10c50 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
10c60 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
10c70 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
10c80 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
10c90 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
10ca0 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
10cb0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
10cc0 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
10cd0 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
10ce0 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
10cf0 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
10d00 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
10d10 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
10d20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
10d30 6d 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  mn){.  int n;.  
10d40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
10d50 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  >db;..  if( p->n
10d60 52 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ResColumn ){.   
10d70 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
10d80 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
10d90 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
10da0 41 4d 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69  AME_N);.    sqli
10db0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10dc0 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a  >aColName);.  }.
10dd0 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
10de0 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
10df0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
10e00 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
10e10 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28   p->aColName = (
10e20 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
10e30 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
10e40 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
10e50 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
10e60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10e70 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
10e80 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c  aColName, n, db,
10e90 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f   MEM_Null);.}../
10ea0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
10eb0 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
10ec0 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
10ed0 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
10ee0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
10ef0 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
10f00 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
10f10 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
10f20 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
10f30 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
10f40 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
10f50 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
10f60 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  mCols()..**.** T
10f70 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
10f80 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62  er, xDel, must b
10f90 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
10fa0 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f  DYNAMIC, SQLITE_
10fb0 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c  STATIC.** or SQL
10fc0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49  ITE_TRANSIENT. I
10fd0 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44  f it is SQLITE_D
10fe0 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65  YNAMIC, then the
10ff0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
11000 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77  ** to by zName w
11010 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
11020 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20  sqlite3DbFree() 
11030 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
11040 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69   destroyed..*/.i
11050 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
11060 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65  tColName(.  Vdbe
11070 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11090 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69  Vdbe being confi
110a0 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  gured */.  int i
110b0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
110c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
110d0 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a  ndex of column z
110e0 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  Name applies to 
110f0 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20  */.  int var,   
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
11120 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f  the COLNAME_* co
11130 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  nstants */.  con
11140 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11160 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
11170 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61  er containing na
11180 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  me */.  void (*x
11190 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20  Del)(void*)     
111a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
111b0 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74  ry management st
111c0 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65  rategy for zName
111d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
111e0 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
111f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
11200 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b  p->nResColumn );
11210 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43  .  assert( var<C
11220 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66  OLNAME_N );.  if
11230 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
11240 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
11250 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78  ert( !zName || x
11260 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41  Del!=SQLITE_DYNA
11270 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  MIC );.    retur
11280 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
11290 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
112a0 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
112b0 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
112c0 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
112d0 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
112e0 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
112f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
11300 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
11310 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
11320 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
11330 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
11340 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
11350 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
11360 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
11370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11380 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
11390 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
113a0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
113b0 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
113c0 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
113d0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
113e0 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
113f0 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
11400 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
11410 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
11420 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
11430 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
11440 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
11450 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
11460 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11470 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
11480 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
11490 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
114a0 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
114b0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
114c0 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
114d0 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
114e0 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
114f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63     ** that are c
11520 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61 20  andidates for a 
11530 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
11540 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20   using a.       
11550 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
11560 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  aster-journal */
11570 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11580 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
11590 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
115a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
115b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
115c0 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
115d0 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
115e0 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
115f0 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
11600 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
11610 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
11620 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
11630 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
11640 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
11650 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
11660 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
11670 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
11680 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
11690 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
116a0 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
116b0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
116c0 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
116d0 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
116e0 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
116f0 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
11700 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
11710 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
11720 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
11730 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
11740 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
11750 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
11760 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
11770 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
11780 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
11790 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
117a0 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
117b0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
117c0 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
117d0 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
117e0 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
117f0 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
11800 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
11810 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
11820 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
11830 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
11840 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
11850 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
11860 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
11870 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
11880 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
11890 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
118a0 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
118b0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
118c0 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
118d0 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
118e0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
118f0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11900 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
11910 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
11920 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
11930 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
11940 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
11950 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ){.      /* Whet
11960 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74  her or not a dat
11970 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64  abase might need
11980 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11990 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20  l depends upon. 
119a0 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72       ** its jour
119b0 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20  nal mode (among 
119c0 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20  other things).  
119d0 54 68 69 73 20 6d 61 74 72 69 78 20 64 65 74 65  This matrix dete
119e0 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20  rmines which.   
119f0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f     ** journal mo
11a00 64 65 73 20 75 73 65 20 61 20 6d 61 73 74 65 72  des use a master
11a10 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69   journal and whi
11a20 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20  ch do not */.   
11a30 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
11a40 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d  u8 aMJNeeded[] =
11a50 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45   {.        /* DE
11a60 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20  LETE   */  1,.  
11a70 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54        /* PERSIST
11a80 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20     */ 1,.       
11a90 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f   /* OFF       */
11aa0 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   0,.        /* T
11ab0 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20  RUNCATE  */ 1,. 
11ac0 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59         /* MEMORY
11ad0 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
11ae0 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a    /* WAL       *
11af0 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  / 0.      };.   
11b00 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
11b10 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73  ;   /* Pager ass
11b20 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74  ociated with pBt
11b30 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63   */.      needXc
11b40 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
11b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11b60 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  er(pBt);.      p
11b70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
11b80 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
11b90 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
11ba0 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[i].safety_leve
11bb0 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l!=PAGER_SYNCHRO
11bc0 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20  NOUS_OFF.       
11bd0 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c  && aMJNeeded[sql
11be0 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72  ite3PagerGetJour
11bf0 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d  nalMode(pPager)]
11c00 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
11c10 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70  e3PagerIsMemdb(p
11c20 50 61 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20  Pager)==0.      
11c30 29 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  ){ .        asse
11c40 72 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20  rt( i!=1 );.    
11c50 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20      nTrans++;.  
11c60 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
11c70 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 78 63   sqlite3BtreeExc
11c80 6c 75 73 69 76 65 4c 6f 63 6b 28 70 42 74 29 3b  lusiveLock(pBt);
11c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
11ca0 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
11cb0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
11cc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
11cd0 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 64  NCURRENT.  if( d
11ce0 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 26  b->bConcurrent &
11cf0 26 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d 53  & (rc & 0xFF)==S
11d00 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
11d10 20 20 2f 2a 20 41 6e 20 53 51 4c 49 54 45 5f 42    /* An SQLITE_B
11d20 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 42 55  USY or SQLITE_BU
11d30 53 59 5f 53 4e 41 50 53 48 4f 54 20 77 61 73 20  SY_SNAPSHOT was 
11d40 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
11d50 65 20 0a 20 20 20 20 2a 2a 20 61 74 74 65 6d 70  e .    ** attemp
11d60 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 65  ting to take the
11d70 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 6f 6e 20   WRITER lock on 
11d80 61 20 77 61 6c 20 66 69 6c 65 2e 20 52 65 6c 65  a wal file. Rele
11d90 61 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 57  ase the.    ** W
11da0 52 49 54 45 52 20 6c 6f 63 6b 73 20 6f 6e 20 61  RITER locks on a
11db0 6c 6c 20 77 61 6c 20 66 69 6c 65 73 20 61 6e 64  ll wal files and
11dc0 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20   return early.  
11dd0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11de0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
11df0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
11e00 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
11e10 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
11e20 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
11e30 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
11e40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11e50 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
11e60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
11e70 44 72 6f 70 45 78 63 6c 75 73 69 76 65 4c 6f 63  DropExclusiveLoc
11e80 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  k(sqlite3BtreePa
11e90 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20  ger(pBt));.     
11ea0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
11eb0 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 20  eave(pBt);.     
11ec0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
11ed0 64 69 66 0a 0a 20 20 69 66 28 20 72 63 21 3d 53  dif..  if( rc!=S
11ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
11f00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
11f10 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
11f20 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
11f30 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
11f40 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
11f50 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
11f60 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
11f70 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
11f80 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
11f90 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
11fa0 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
11fb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11fc0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
11fd0 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
11fe0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
11ff0 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
12000 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
12010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
12020 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
12030 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
12040 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
12050 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
12060 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
12070 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
12080 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
12090 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
120a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
120b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
120c0 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
120d0 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
120e0 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
120f0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12100 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
12110 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
12120 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
12130 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
12140 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
12150 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
12160 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
12170 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
12180 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
12190 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
121a0 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
121b0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
121c0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
121d0 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
121e0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
121f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12200 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12210 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
12220 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12230 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12240 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
12250 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12260 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
12270 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
12280 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
12290 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
122a0 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
122b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
122c0 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
122d0 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
122e0 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
122f0 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
12300 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
12310 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
12320 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
12330 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
12340 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
12350 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
12360 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
12370 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
12380 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
12390 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
123a0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
123b0 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
123c0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
123d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
123e0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
123f0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
12400 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
12410 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
12420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12430 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12440 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
12450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
12480 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
12490 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
124a0 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
124b0 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
124c0 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
124d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
124e0 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
124f0 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
12500 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12510 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
12520 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
12530 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
12540 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23  omically..  */.#
12550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12560 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
12570 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
12580 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
12590 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  fs;.    char *zM
125a0 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
125b0 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
125c0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
125d0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
125e0 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
125f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
12600 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
12610 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
12620 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
12630 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
12640 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
12650 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
12660 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
12670 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
12680 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
12690 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
126a0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
126b0 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
126c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
126d0 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
126e0 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
126f0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
12700 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
12710 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
12720 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
12730 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12740 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
12750 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
12760 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66  Random;.      if
12770 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a  ( retryCount ){.
12780 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
12790 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20  yCount>100 ){.  
127a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
127b0 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
127c0 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22   "MJ delete: %s"
127d0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
127e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
127f0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
12800 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
12810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12820 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72    }else if( retr
12830 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  yCount==1 ){.   
12840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
12850 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
12860 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22  "MJ collide: %s"
12870 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12880 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12890 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b      retryCount++
128a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
128b0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
128c0 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
128d0 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ndom);.      sql
128e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33  ite3_snprintf(13
128f0 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e  , &zMaster[nMain
12900 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39  File], "-mj%06X9
12910 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20  %02X",.         
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e        (iRandom>>
12940 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61  8)&0xffffff, iRa
12950 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20  ndom&0xff);.    
12960 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e    /* The antipen
12970 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74  ultimate charact
12980 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  er of the master
12990 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
129a0 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22  st.      ** be "
129b0 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65  9" to avoid name
129c0 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e   collisions when
129d0 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e   using 8+3 filen
129e0 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ames. */.      a
129f0 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73  ssert( zMaster[s
12a00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12a10 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20  Master)-3]=='9' 
12a20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12a30 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69  FileSuffix3(zMai
12a40 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b  nFile, zMaster);
12a50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12a60 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
12a70 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
12a80 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
12a90 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
12aa0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
12ab0 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
12ac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12ad0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
12ae0 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
12af0 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
12b00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
12b10 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
12b20 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
12b30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
12b40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12b50 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
12b60 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
12b70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
12b80 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
12b90 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
12ba0 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
12bb0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
12bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12bd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12be0 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
12bf0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12c00 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
12c10 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
12c20 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
12c30 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
12c40 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
12c50 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
12c60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
12c70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12c80 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
12c90 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
12ca0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
12cb0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12cc0 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
12cd0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
12ce0 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
12cf0 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
12d00 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12d10 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
12d20 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
12d30 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
12d40 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
12d50 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
12d60 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
12d70 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
12d80 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
12d90 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
12da0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
12db0 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
12dc0 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
12dd0 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
12de0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
12df0 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
12e00 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
12e10 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
12e20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
12e30 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
12e40 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
12e50 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
12e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12e70 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
12e80 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
12e90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
12ea0 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
12eb0 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
12ec0 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
12ed0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
12ee0 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
12ef0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
12f00 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
12f10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12f20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12f30 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
12f40 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
12f50 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
12f60 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
12f70 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
12f80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12f90 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
12fa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12fc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
12fd0 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
12fe0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
12ff0 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
13000 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
13010 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
13020 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
13030 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
13040 69 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f  if( 0==(sqlite3O
13050 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
13060 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
13070 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
13080 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
13090 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
130a0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
130b0 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
130c0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
130d0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
130e0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
130f0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
13100 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
13110 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
13120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
13130 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
13140 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13150 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
13160 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
13170 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
13180 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
13190 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
131a0 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
131b0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
131c0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
131d0 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
131e0 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
131f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
13200 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
13210 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
13220 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
13230 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
13240 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
13250 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
13260 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
13270 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
13280 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
13290 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
132a0 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
132b0 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
132c0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
132d0 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
132e0 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
132f0 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
13300 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
13310 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
13320 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
13330 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
13340 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
13350 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
13360 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
13370 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
13380 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
13390 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
133a0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
133b0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
133c0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
133d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
133e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
133f0 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
13400 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
13410 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13420 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
13430 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
13440 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
13450 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
13460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13470 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13480 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
13490 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
134a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
134b0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
134c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
134d0 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
134e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
134f0 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
13500 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
13510 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
13520 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
13530 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
13540 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
13550 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
13560 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
13570 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
13580 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
13590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
135a0 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
135b0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
135c0 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
135d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
135e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
135f0 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
13600 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
13610 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
13620 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
13630 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
13640 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
13650 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
13660 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
13670 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
13680 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
13690 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
136a0 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
136b0 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
136c0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
136d0 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
136e0 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
136f0 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
13700 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
13710 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
13720 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
13730 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
13740 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
13750 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
13760 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
13770 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
13780 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
13790 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
137a0 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
137b0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
137c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
137d0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
137e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
137f0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
13800 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
13810 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
13820 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
13830 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
13840 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
13850 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b  haseTwo(pBt, 1);
13860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13870 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
13880 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
13890 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
138a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
138b0 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
138c0 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
138d0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
138e0 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
138f0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
13900 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
13910 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63  e3.nVdbeActive c
13920 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
13930 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
13940 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
13950 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
13960 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
13970 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
13980 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
13990 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
139a0 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
139b0 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
139c0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
139d0 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
139e0 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
139f0 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
13a00 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
13a10 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
13a20 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
13a30 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
13a40 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
13a50 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
13a60 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
13a70 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
13a80 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
13a90 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
13aa0 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20   0;.  int nRead 
13ab0 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
13ac0 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
13ad0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
13ae0 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73  te3_stmt_busy((s
13af0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20  qlite3_stmt*)p) 
13b00 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
13b10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61        if( p->rea
13b20 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74  dOnly==0 ) nWrit
13b30 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
13b40 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52  ->bIsReader ) nR
13b50 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ead++;.    }.   
13b60 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
13b70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
13b80 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ==db->nVdbeActiv
13b90 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
13ba0 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65  Write==db->nVdbe
13bb0 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72  Write );.  asser
13bc0 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56  t( nRead==db->nV
13bd0 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c  dbeRead );.}.#el
13be0 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
13bf0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
13c00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
13c10 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  f the Vdbe passe
13c20 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
13c30 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61  rgument opened a
13c40 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
13c50 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65  action,.** close
13c60 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e   it now. Argumen
13c70 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69  t eOp must be ei
13c80 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
13c90 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41  OLLBACK or.** SA
13ca0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
13cb0 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
13cc0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
13cd0 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
13ce0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
13cf0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
13d00 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f  If eOp is SAVEPO
13d10 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
13d20 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d  n the .** statem
13d30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
13d40 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
13d50 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
13d60 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
13d70 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
13d80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
13d90 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
13da0 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
13db0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
13dc0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64  _NOINLINE int vd
13dd0 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
13de0 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
13df0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
13e00 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
13e10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13e20 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
13e30 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76    const int iSav
13e40 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61  epoint = p->iSta
13e50 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73  tement-1;..  ass
13e60 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
13e70 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
13e80 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
13e90 45 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72  ELEASE);.  asser
13ea0 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
13eb0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
13ec0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
13ed0 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
13ee0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
13ef0 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
13f00 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
13f10 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53  .    int rc2 = S
13f20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74  QLITE_OK;.    Bt
13f30 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
13f40 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
13f50 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
13f60 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
13f70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
13f80 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
13f90 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
13fa0 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
13fb0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
13fc0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
13fd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d  .      if( rc2==
13fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13ff0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
14000 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
14010 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
14020 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
14030 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
14040 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14060 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
14070 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64   }.    }.  }.  d
14080 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
14090 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
140a0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d   = 0;..  if( rc=
140b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
140c0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
140d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
140e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
140f0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
14100 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
14110 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
14120 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
14130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14140 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
14150 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
14160 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
14170 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
14180 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
14190 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
141a0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
141b0 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
141c0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
141d0 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
141e0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
141f0 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
14200 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
14210 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
14220 68 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74  had when .  ** t
14230 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
14240 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
14250 6e 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65  ned.  */.  if( e
14260 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
14270 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62  LLBACK ){.    db
14280 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
14290 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
142a0 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  s;.    db->nDefe
142b0 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
142c0 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
142d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
142e0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
142f0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
14300 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
14310 65 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64  eOp){.  if( p->d
14320 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
14330 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
14340 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 76 64 62  {.    return vdb
14350 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14360 70 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72  p, eOp);.  }.  r
14370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14380 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
14390 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
143a0 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
143b0 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
143c0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
143d0 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
143e0 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
143f0 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
14400 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
14410 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
14420 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
14430 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
14440 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
14450 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
14460 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
14470 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
14480 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
14490 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
144a0 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
144b0 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
144c0 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
144d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
144e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
144f0 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
14500 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
14510 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
14520 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77  EIGNKEY.** and w
14530 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
14540 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
14550 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
14560 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
14570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
14580 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
14590 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
145a0 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
145b0 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
145c0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
145d0 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
145e0 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65  && (db->nDeferre
145f0 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72  dCons+db->nDefer
14600 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a  redImmCons)>0) .
14610 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64     || (!deferred
14620 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
14630 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20  aint>0) .  ){.  
14640 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14650 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
14660 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65  IGNKEY;.    p->e
14670 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
14680 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  Abort;.    sqlit
14690 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
146a0 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
146b0 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
146c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
146d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
146e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
146f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
14700 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14710 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
14720 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
14730 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
14740 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
14750 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
14760 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
14770 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
14780 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
14790 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
147a0 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
147b0 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
147c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
147d0 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
147e0 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
147f0 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
14800 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
14810 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
14820 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
14830 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
14840 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
14850 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
14860 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
14870 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
14880 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
14890 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
148a0 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
148b0 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
148c0 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
148d0 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
148e0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
148f0 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
14900 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
14910 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
14920 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
14930 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
14940 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
14950 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
14960 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
14970 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14990 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
149a0 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
149b0 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
149c0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
149d0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
149e0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
149f0 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
14a00 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
14a10 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
14a20 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
14a30 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
14a40 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
14a50 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
14a60 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
14a70 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
14a80 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
14a90 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
14aa0 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
14ab0 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
14ac0 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
14ad0 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
14ae0 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
14af0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
14b00 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
14b10 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
14b20 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
14b30 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
14b40 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
14b50 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
14b60 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
14b70 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
14b80 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
14b90 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
14ba0 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
14bb0 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
14bc0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
14bd0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
14be0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14bf0 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
14c00 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
14c10 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
14c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14c30 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  K;.  }.  if( db-
14c40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14c50 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
14c60 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
14c70 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
14c80 72 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63  rsors(p);.  chec
14c90 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
14ca0 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
14cb0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
14cc0 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
14cd0 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
14ce0 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20  ted or if the.  
14cf0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
14d00 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f   does not read o
14d10 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61  r write a databa
14d20 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69  se file.  */.  i
14d30 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70  f( p->pc>=0 && p
14d40 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20  ->bIsReader ){. 
14d50 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
14d60 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
14d70 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
14d80 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  /.    int eState
14d90 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20  mentOp = 0;.    
14da0 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
14db0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
14dc0 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
14dd0 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72   a 'special' err
14de0 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  or */..    /* Lo
14df0 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
14e00 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
14e10 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
14e20 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
14e30 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
14e40 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
14e50 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
14e60 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
14e70 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
14e80 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
14e90 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
14ea0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
14eb0 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
14ec0 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
14ed0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
14ee0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
14ef0 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
14f00 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
14f10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14f20 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
14f30 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
14f40 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
14f50 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
14f60 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
14f70 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
14f80 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
14f90 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
14fa0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
14fb0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
14fc0 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
14fd0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
14fe0 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
14ff0 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
15000 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
15010 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
15020 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
15030 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
15040 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
15050 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
15060 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
15070 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
15080 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
15090 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
150a0 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  ** occurred whil
150b0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
150c0 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
150d0 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
150e0 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
150f0 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
15100 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
15110 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
15120 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
15130 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
15140 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
15150 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
15160 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
15170 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
15180 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
15190 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
151a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
151b0 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
151c0 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
151d0 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
151e0 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
151f0 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
15200 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
15210 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
15220 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
15230 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
15240 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15250 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
15260 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
15270 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
15280 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
15290 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
152a0 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
152b0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
152c0 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
152d0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
152e0 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
152f0 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
15300 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15310 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
15320 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
15330 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
15340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
15350 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
15360 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
15370 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
15380 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
15390 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74   db->bConcurrent
153a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
153b0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
153c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
153d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
153e0 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
153f0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
15400 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
15410 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
15420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15430 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
15440 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
15450 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
15460 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
15470 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
15480 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
15490 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
154a0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
154b0 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
154c0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
154d0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
154e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
154f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
15500 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
15510 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
15520 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
15530 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
15540 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
15550 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
15560 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
15570 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
15580 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
15590 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
155a0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
155b0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
155c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
155d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
155e0 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
155f0 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
15600 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
15610 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
15620 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
15630 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
15640 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15660 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
15670 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
15680 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15690 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
156a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
156b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
156c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
156d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
156e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
156f0 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
15700 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
15710 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
15720 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
15730 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
15740 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
15750 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
15760 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
15770 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
15780 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
15790 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
157a0 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
157b0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
157c0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
157d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
157e0 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
157f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
15800 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
15810 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
15820 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
15830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15840 20 20 69 66 28 20 28 72 63 20 26 20 30 78 46 46    if( (rc & 0xFF
15850 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
15860 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
15870 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15880 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
15890 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
158a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   rc;.        }el
158b0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
158c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
158d0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
158e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
158f0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
15900 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
15910 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
15920 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
15930 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
15940 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
15950 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
15960 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
15970 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
15980 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
15990 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
159a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
159b0 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
159c0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
159d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
159e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
159f0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
15a00 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
15a10 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
15a20 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
15a30 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
15a40 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
15a50 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
15a60 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
15a70 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15a80 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
15a90 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
15aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
15ab0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
15ac0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
15ad0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
15ae0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
15af0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
15b00 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
15b10 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
15b20 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
15b30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15b40 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
15b50 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
15b60 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
15b70 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
15b80 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
15b90 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
15ba0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
15bb0 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74   db->bConcurrent
15bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
15bd0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
15be0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
15bf0 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
15c00 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
15c10 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
15c20 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
15c30 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
15c40 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
15c50 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
15c60 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
15c70 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
15c80 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
15c90 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
15ca0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
15cb0 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
15cc0 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
15cd0 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
15ce0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
15cf0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
15d00 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
15d10 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
15d20 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
15d30 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
15d40 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
15d50 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
15d60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
15d70 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
15d80 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
15d90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
15da0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
15db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
15dc0 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
15dd0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
15de0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
15df0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
15e00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15e10 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
15e20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
15e30 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
15e40 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
15e50 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
15e60 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
15e70 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
15e80 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
15e90 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
15ea0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
15eb0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
15ec0 20 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65     db->bConcurre
15ed0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nt = 0;.        
15ee0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
15ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15f00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
15f10 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
15f20 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
15f30 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
15f40 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
15f50 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
15f60 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
15f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
15f80 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
15f90 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
15fa0 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
15fb0 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
15fc0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
15fd0 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
15fe0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
15ff0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
16000 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
16010 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
16020 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
16030 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
16040 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
16050 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
16060 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
16070 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
16080 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
16090 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
160a0 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
160b0 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
160c0 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
160d0 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
160e0 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
160f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
16100 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
16110 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
16120 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
16130 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
16140 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
16150 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
16160 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
16170 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
16180 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
16190 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
161a0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
161b0 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
161c0 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
161d0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
161e0 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
161f0 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
16200 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
16210 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
16220 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  (db);.  if( db->
16230 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
16240 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16250 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
16260 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
16270 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
16280 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
16290 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
162a0 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
162b0 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
162c0 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
162d0 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
162e0 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
162f0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
16300 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
16310 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
16320 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
16330 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
16340 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
16350 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
16360 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
16370 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
16380 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
16390 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
163a0 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
163b0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
163c0 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
163d0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
163e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
163f0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
16400 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
16410 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
16420 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
16430 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
16440 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
16450 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
16460 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
16470 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
16480 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
16490 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
164a0 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
164b0 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
164c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
164d0 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
164e0 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
164f0 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
16500 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
16510 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
16520 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
16530 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
16540 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
16550 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
16560 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
16570 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
16580 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
16590 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
165a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
165b0 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
165c0 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
165d0 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
165e0 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
165f0 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
16600 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
16610 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
16620 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
16630 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
16640 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
16650 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
16660 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
16670 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  {.    db->bBenig
16680 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73  nMalloc++;.    s
16690 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
166a0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
166b0 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
166c0 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
166d0 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
166e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
166f0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
16700 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
16710 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
16720 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
16730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
16740 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
16750 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
16760 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65  alloc--;.  }else
16770 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b   if( db->pErr ){
16780 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
16790 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72  eSetNull(db->pEr
167a0 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72  r);.  }.  db->er
167b0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 65  rCode = rc;.  re
167c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
167d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
167e0 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
167f0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
16800 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
16810 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
16820 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
16830 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
16840 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
16850 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
16860 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
16870 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
16880 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
16890 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
168a0 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
168b0 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
168c0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
168d0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
168e0 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
168f0 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
16900 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
16910 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
16920 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
16930 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
16940 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
16950 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16960 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
16970 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
16980 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
16990 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
169a0 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
169b0 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
169c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
169d0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
169e0 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
169f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
16a00 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
16a10 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
16a20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
16a30 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
16a40 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
16a50 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
16a60 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
16a70 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
16a80 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
16a90 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
16aa0 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
16ab0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
16ac0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
16ad0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
16ae0 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
16af0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
16b00 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
16b10 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
16b20 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
16b30 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
16b40 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
16b50 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
16b60 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
16b70 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
16b80 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
16b90 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
16ba0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
16bb0 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
16bc0 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
16bd0 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  i;.#endif..  sql
16be0 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
16bf0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
16c00 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
16c10 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
16c20 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
16c30 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
16c40 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
16c50 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
16c60 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
16c70 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
16c80 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
16c90 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
16ca0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
16cb0 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
16cc0 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
16cd0 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
16ce0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
16cf0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
16d00 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
16d10 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
16d20 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
16d30 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
16d40 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
16d50 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
16d60 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
16d70 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
16d80 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
16d90 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
16da0 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
16db0 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
16dc0 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
16dd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16de0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62  pc>=0 ){.    vdb
16df0 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29  eInvokeSqllog(p)
16e00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16e10 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70  eTransferError(p
16e20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  );.    if( p->ru
16e30 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
16e40 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
16e50 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
16e60 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
16e70 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
16e80 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
16e90 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
16ea0 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
16eb0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
16ec0 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
16ed0 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
16ee0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
16ef0 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
16f00 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
16f10 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
16f20 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
16f30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
16f40 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
16f50 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
16f60 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
16f70 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
16f80 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20    }..  /* Reset 
16f90 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74  register content
16fa0 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65 72  s and reclaim er
16fb0 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f  ror message memo
16fc0 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ry..  */.#ifdef 
16fd0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
16fe0 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
16ff0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
17000 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
17010 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
17020 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
17030 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
17040 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
17050 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
17060 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
17070 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
17080 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
17090 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
170a0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
170b0 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  m ){.    for(i=0
170c0 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
170d0 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
170e0 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
170f0 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d  Undefined );.  }
17100 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
17110 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
17120 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
17130 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
17140 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
17150 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
17160 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
17170 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
17180 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
17190 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
171a0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
171b0 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
171c0 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
171d0 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
171e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
171f0 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
17200 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
17210 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
17220 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
17230 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
17240 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
17250 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
17260 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
17270 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c       if( p->zSql
17280 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
17290 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20   c, pc = 0;.    
172a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
172b0 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
172c0 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70   for(i=0; (c = p
172d0 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69  ->zSql[i])!=0; i
172e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
172f0 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70  f( pc=='\n' ) fp
17300 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
17310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
17320 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(c, out);.     
17330 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
17340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17350 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70  f( pc!='\n' ) fp
17360 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
17370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17380 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
17390 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
173a0 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b   char zHdr[100];
173b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
173c0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
173d0 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25  (zHdr), zHdr, "%
173e0 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20  6u %12llu %8llu 
173f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
17400 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
17410 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
17420 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
17430 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
17440 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
17450 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
17460 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
17470 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72    );.        fpr
17480 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
17490 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73  zHdr);.        s
174a0 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
174b0 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
174c0 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
174d0 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
174e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
174f0 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
17500 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54  VDBE_MAGIC_RESET
17510 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
17520 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
17530 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
17540 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
17550 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
17560 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
17570 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
17580 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
17590 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
175a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
175b0 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
175c0 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
175d0 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
175e0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
175f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17600 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
17610 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
17620 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
17630 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
17640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
17650 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
17660 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
17670 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
17680 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
17690 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
176a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
176b0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
176c0 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
176d0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
176e0 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
176f0 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
17700 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
17710 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
17720 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
17730 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
17740 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
17750 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
17760 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
17770 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
17780 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
17790 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
177a0 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
177b0 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
177c0 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
177d0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
177e0 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
177f0 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
17800 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
17810 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
17820 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
17830 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
17840 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
17850 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
17860 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
17870 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
17880 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
17890 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
178a0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
178b0 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
178c0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
178d0 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
178e0 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
178f0 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
17900 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
17910 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
17920 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  responds to bit 
17930 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
17940 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
17950 74 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65  teAuxData(sqlite
17960 33 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a  3 *db, AuxData *
17970 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  *pp, int iOp, in
17980 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65  t mask){.  while
17990 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78  ( *pp ){.    Aux
179a0 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70  Data *pAux = *pp
179b0 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30  ;.    if( (iOp<0
179c0 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d  ).     || (pAux-
179d0 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20  >iAuxOp==iOp.   
179e0 20 20 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e         && pAux->
179f0 69 41 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20  iAuxArg>=0.     
17a00 20 20 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69       && (pAux->i
17a10 41 75 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d  AuxArg>31 || !(m
17a20 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28  ask & MASKBIT32(
17a30 70 41 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29  pAux->iAuxArg)))
17a40 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
17a50 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
17a60 41 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20  AuxArg==31 );.  
17a70 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
17a80 65 6c 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20  eleteAux ){.    
17a90 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
17aa0 65 41 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29  eAux(pAux->pAux)
17ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17ac0 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78  *pp = pAux->pNex
17ad0 74 41 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69  tAux;.      sqli
17ae0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41  te3DbFree(db, pA
17af0 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ux);.    }else{.
17b00 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d        pp= &pAux-
17b10 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d  >pNextAux;.    }
17b20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
17b30 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
17b40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
17b50 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
17b60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
17b70 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20  ment,.** except 
17b80 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  for object itsel
17b90 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73  f, which is pres
17ba0 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erved..**.** The
17bb0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
17bc0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
17bd0 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
17be0 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
17bf0 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
17c00 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
17c10 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
17c20 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
17c30 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
17c40 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
17c50 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  nection and free
17c60 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73  s the object its
17c70 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  elf..*/.void sql
17c80 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
17c90 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
17ca0 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62   Vdbe *p){.  Sub
17cb0 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a  Program *pSub, *
17cc0 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28  pNext;.  assert(
17cd0 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
17ce0 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
17cf0 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
17d00 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
17d10 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
17d20 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d  );.  for(pSub=p-
17d30 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b  >pProgram; pSub;
17d40 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20   pSub=pNext){.  
17d50 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e    pNext = pSub->
17d60 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46  pNext;.    vdbeF
17d70 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
17d80 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e  Sub->aOp, pSub->
17d90 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nOp);.    sqlite
17da0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
17db0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
17dc0 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
17dd0 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65  C_INIT ){.    re
17de0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
17df0 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
17e00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
17e10 65 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74  ee(db, p->pVList
17e20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
17e30 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
17e40 65 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72  e);.  }.  vdbeFr
17e50 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d  eeOpArray(db, p-
17e60 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  >aOp, p->nOp);. 
17e70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17e80 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
17e90 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17ea0 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23  (db, p->zSql);.#
17eb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17ec0 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
17ed0 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  TUS.  {.    int 
17ee0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
17ef0 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29  i<p->nScan; i++)
17f00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
17f10 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
17f20 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  an[i].zName);.  
17f30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
17f40 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
17f50 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  an);.  }.#endif.
17f60 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
17f70 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
17f80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
17f90 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
17fa0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
17fb0 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
17fc0 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
17fd0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
17fe0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17ff0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
18000 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
18010 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
18020 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
18030 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
18040 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
18050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
18060 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
18070 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
18080 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
18090 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
180a0 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
180b0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
180c0 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
180d0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
180e0 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
180f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
18100 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
18110 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
18120 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65  sor "p" has a pe
18130 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61  nding seek opera
18140 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
18150 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61  t yet been.** ca
18160 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b  rried out.  Seek
18170 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e   the cursor now.
18180 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
18190 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
181a0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
181b0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
181c0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
181d0 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
181e0 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56  DeferredMoveto(V
181f0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
18200 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
18210 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
18220 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
18230 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
18240 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  nt;.#endif.  ass
18250 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64  ert( p->deferred
18260 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65  Moveto );.  asse
18270 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
18280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
18290 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
182a0 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d  _BTREE );.  rc =
182b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
182c0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75  etoUnpacked(p->u
182d0 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  c.pCursor, 0, p-
182e0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
182f0 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
18300 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
18310 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
18320 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18330 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
18340 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
18350 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
18360 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
18370 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
18380 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
18390 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
183a0 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
183b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
183c0 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
183d0 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
183e0 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
183f0 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
18400 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
18410 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
18420 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
18430 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
18440 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
18450 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
18460 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
18470 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
18480 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
18490 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
184a0 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
184b0 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
184c0 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
184d0 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
184e0 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
184f0 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
18500 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
18510 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
18520 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
18530 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
18540 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
18550 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
18560 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
18570 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
18580 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
18590 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63  .  assert( p->uc
185a0 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
185b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
185c0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
185d0 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
185e0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
185f0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
18600 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75  estore(p->uc.pCu
18610 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65  rsor, &isDiffere
18620 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63  ntRow);.  p->cac
18630 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
18640 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73  _STALE;.  if( is
18650 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70  DifferentRow ) p
18660 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
18670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18680 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e  *.** Check to en
18690 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
186a0 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
186b0 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
186c0 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65  or.** if need be
186d0 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f  .  Return any I/
186e0 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65  O error from the
186f0 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69   restore operati
18700 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
18710 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
18720 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a  ore(VdbeCursor *
18730 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
18740 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
18750 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66  PE_BTREE );.  if
18760 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
18770 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
18780 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
18790 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
187a0 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
187b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
187c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
187d0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
187e0 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
187f0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
18800 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
18810 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
18820 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
18830 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
18840 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
18850 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
18860 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
18870 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
18880 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
18890 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
188a0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
188b0 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
188c0 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
188d0 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
188e0 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
188f0 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
18900 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
18910 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
18920 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
18930 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
18940 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
18950 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
18960 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
18970 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
18980 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
18990 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
189a0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
189b0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
189c0 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
189d0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
189e0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
189f0 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
18a00 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
18a10 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18a20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18a30 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
18a40 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70  (VdbeCursor **pp
18a50 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20  , int *piCol){. 
18a60 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d   VdbeCursor *p =
18a70 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74 28 20   *pp;.  assert( 
18a80 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
18a90 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d  TYPE_BTREE || p-
18aa0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
18ab0 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20 20 69  PE_PSEUDO );.  i
18ac0 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
18ad0 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
18ae0 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20 70 2d  iMap;.    if( p-
18af0 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61  >aAltMap && (iMa
18b00 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31  p = p->aAltMap[1
18b10 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20  +*piCol])>0 ){. 
18b20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41       *pp = p->pA
18b30 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ltCursor;.      
18b40 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20  *piCol = iMap - 
18b50 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
18b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18b70 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
18b80 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
18b90 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (p);.  }.  if( s
18ba0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18bb0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
18bc0 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
18bd0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
18be0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
18bf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18c00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
18c10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
18c20 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
18c30 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
18c40 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
18c50 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18c60 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
18c70 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
18c80 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18c90 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
18ca0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
18cb0 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
18cc0 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
18cd0 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
18ce0 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
18cf0 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
18d00 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
18d10 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
18d20 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
18d30 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
18d40 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
18d50 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
18d60 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
18d70 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
18d80 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
18d90 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
18da0 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
18db0 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
18dc0 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
18dd0 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
18de0 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
18df0 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
18e00 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
18e10 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
18e20 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
18e30 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
18e40 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
18e50 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18e60 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
18e70 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
18e80 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
18e90 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
18ea0 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
18eb0 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
18ec0 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
18ed0 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
18ee0 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eparately..**.**
18ef0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
18f00 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
18f10 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
18f20 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
18f30 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
18f40 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
18f50 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
18f60 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
18f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
18f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
18f90 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
18fa0 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
18fd0 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
19000 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
19010 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
19020 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
19030 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
19040 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19060 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
19070 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
19080 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
190a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
190b0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
190c0 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
190d0 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
190e0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
190f0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
19120 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
19130 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
19150 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
19160 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19190 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
191a0 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
191d0 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
191e0 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19200 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
19210 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
19220 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
19230 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
19240 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
19250 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
19260 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
19270 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
19280 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
19290 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
192a0 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
192b0 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
192c0 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
192d0 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
192e0 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
192f0 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
19300 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
19310 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
19320 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
19330 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
19340 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
19350 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
19360 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
19370 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20  ile_format, u32 
19380 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c  *pLen){.  int fl
19390 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
193a0 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61  s;.  u32 n;..  a
193b0 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29  ssert( pLen!=0 )
193c0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ;.  if( flags&ME
193d0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Null ){.    *p
193e0 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Len = 0;.    ret
193f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
19400 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
19410 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
19420 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
19430 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
19440 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
19450 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
19460 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
19470 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
19480 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
19490 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
194a0 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
194b0 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20       u = ~i;.   
194c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
194d0 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
194e0 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
194f0 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20     if( (i&1)==i 
19500 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
19510 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  4 ){.        *pL
19520 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
19530 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b  return 8+(u32)u;
19540 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19550 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b        *pLen = 1;
19560 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19570 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
19580 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
19590 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20  7 ){ *pLen = 2; 
195a0 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20  return 2; }.    
195b0 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
195c0 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74  { *pLen = 3; ret
195d0 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28  urn 3; }.    if(
195e0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
195f0 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74  { *pLen = 4; ret
19600 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28  urn 4; }.    if(
19610 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b   u<=MAX_6BYTE ){
19620 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75   *pLen = 6; retu
19630 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65  rn 5; }.    *pLe
19640 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
19650 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
19660 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
19670 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
19680 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
19690 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
196a0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
196b0 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
196c0 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
196d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
196e0 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20  ->n>=0 );.  n = 
196f0 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  (u32)pMem->n;.  
19700 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
19710 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
19720 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
19730 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b    }.  *pLen = n;
19740 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
19750 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
19760 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
19770 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
19780 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70  s for serial typ
19790 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  es less than 128
197a0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
197b0 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   u8 sqlite3Small
197c0 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a  TypeSizes[] = {.
197d0 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20          /*  0   
197e0 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20  1   2   3   4   
197f0 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20  5   6   7   8   
19800 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a  9 */   ./*   0 *
19810 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20  /   0,  1,  2,  
19820 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20  3,  4,  6,  8,  
19830 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31  8,  0,  0,./*  1
19840 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  0 */   0,  0,  0
19850 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32  ,  0,  1,  1,  2
19860 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a  ,  2,  3,  3,./*
19870 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c    20 */   4,  4,
19880 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c    5,  5,  6,  6,
19890 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c    7,  7,  8,  8,
198a0 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20  ./*  30 */   9, 
198b0 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20   9, 10, 10, 11, 
198c0 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20  11, 12, 12, 13, 
198d0 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31  13,./*  40 */  1
198e0 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31  4, 14, 15, 15, 1
198f0 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31  6, 16, 17, 17, 1
19900 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f  8, 18,./*  50 */
19910 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30    19, 19, 20, 20
19920 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32  , 21, 21, 22, 22
19930 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30  , 23, 23,./*  60
19940 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c   */  24, 24, 25,
19950 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c   25, 26, 26, 27,
19960 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20   27, 28, 28,./* 
19970 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20   70 */  29, 29, 
19980 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20  30, 30, 31, 31, 
19990 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a  32, 32, 33, 33,.
199a0 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33  /*  80 */  34, 3
199b0 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33  4, 35, 35, 36, 3
199c0 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33  6, 37, 37, 38, 3
199d0 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39  8,./*  90 */  39
199e0 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31  , 39, 40, 40, 41
199f0 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33  , 41, 42, 42, 43
19a00 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20  , 43,./* 100 */ 
19a10 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c   44, 44, 45, 45,
19a20 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c   46, 46, 47, 47,
19a30 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20   48, 48,./* 110 
19a40 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20  */  49, 49, 50, 
19a50 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20  50, 51, 51, 52, 
19a60 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31  52, 53, 53,./* 1
19a70 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35  20 */  54, 54, 5
19a80 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35  5, 55, 56, 56, 5
19a90 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  7, 57.};../*.** 
19aa0 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
19ab0 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
19ac0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
19ad0 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
19ae0 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
19af0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19b00 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
19b10 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
19b20 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
19b30 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  8 ){.    return 
19b40 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
19b50 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
19b60 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
19b70 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20  type<12 .       
19b80 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
19b90 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
19ba0 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72  rial_type]==(ser
19bb0 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32  ial_type - 12)/2
19bc0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   );.    return s
19bd0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
19be0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
19bf0 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69  ];.  }.}.u8 sqli
19c00 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65  te3VdbeOneByteSe
19c10 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73  rialTypeLen(u8 s
19c20 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61  erial_type){.  a
19c30 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
19c40 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75  pe<128 );.  retu
19c50 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
19c60 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
19c70 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  type];  .}../*.*
19c80 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
19c90 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
19ca0 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
19cb0 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
19cc0 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
19cd0 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
19ce0 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
19cf0 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
19d00 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
19d10 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
19d20 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
19d30 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
19d40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
19d50 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
19d60 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
19d70 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
19d80 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
19d90 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
19da0 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
19db0 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
19dc0 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
19dd0 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
19de0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
19df0 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
19e00 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
19e10 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
19e20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
19e30 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
19e40 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
19e50 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
19e60 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
19e70 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
19e80 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
19e90 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
19ea0 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
19eb0 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
19ec0 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
19ed0 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
19ee0 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
19ef0 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
19f00 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
19f10 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
19f20 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
19f30 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
19f40 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
19f50 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
19f60 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
19f70 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
19f80 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
19f90 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
19fa0 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
19fb0 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
19fc0 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
19fd0 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
19fe0 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
19ff0 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
1a000 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
1a010 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
1a020 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
1a030 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
1a040 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
1a050 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
1a060 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
1a070 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
1a080 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
1a090 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
1a0a0 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
1a0b0 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
1a0c0 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
1a0d0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
1a0e0 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
1a0f0 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
1a100 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
1a110 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
1a120 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
1a130 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
1a140 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
1a150 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
1a160 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
1a170 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
1a180 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
1a190 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
1a1a0 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
1a1b0 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
1a1c0 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
1a1d0 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
1a1e0 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
1a1f0 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
1a200 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
1a210 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
1a220 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
1a230 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
1a240 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
1a250 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
1a260 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
1a270 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
1a280 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
1a290 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
1a2a0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
1a2b0 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
1a2c0 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
1a2d0 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
1a2e0 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
1a2f0 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
1a300 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
1a310 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
1a320 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
1a330 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
1a340 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
1a350 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
1a360 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
1a370 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
1a380 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
1a390 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
1a3a0 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
1a3b0 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
1a3c0 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
1a3d0 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
1a3e0 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
1a3f0 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
1a400 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
1a410 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1a420 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
1a430 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
1a440 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
1a450 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
1a460 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
1a470 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
1a480 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1a490 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1a4a0 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
1a4b0 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
1a4c0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1a4d0 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
1a4e0 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
1a4f0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
1a500 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
1a510 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69  ].  The caller i
1a520 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a  s responsible.**
1a530 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20   for allocating 
1a540 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
1a550 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68  buf[] to hold th
1a560 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20  e entire field, 
1a570 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20  exclusive.** of 
1a580 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  the pMem->u.nZer
1a590 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45  o bytes for a ME
1a5a0 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a  M_Zero value..**
1a5b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1a5c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1a5d0 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
1a5e0 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
1a5f0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
1a600 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
1a610 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
1a620 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
1a630 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
1a640 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
1a650 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
1a660 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32  n buf[]..*/ .u32
1a670 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1a680 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d  alPut(u8 *buf, M
1a690 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65  em *pMem, u32 se
1a6a0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33  rial_type){.  u3
1a6b0 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
1a6c0 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
1a6d0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
1a6e0 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
1a6f0 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
1a700 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
1a710 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1a720 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1a730 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
1a740 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
1a750 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  u.r) );.      me
1a760 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
1a770 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b  u.r, sizeof(v));
1a780 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
1a790 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a  EndianFloat(v);.
1a7a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a7b0 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   v = pMem->u.i;.
1a7c0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
1a7d0 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  i = sqlite3Small
1a7e0 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
1a7f0 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65  _type];.    asse
1a800 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64  rt( i>0 );.    d
1a810 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69  o{.      buf[--i
1a820 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
1a830 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
1a840 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29  .    }while( i )
1a850 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
1a860 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
1a870 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
1a880 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1a890 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
1a8a0 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
1a8b0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
1a8c0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
1a8d0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
1a8e0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
1a8f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1a900 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1a910 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
1a920 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28  pMem->n;.    if(
1a930 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28   len>0 ) memcpy(
1a940 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
1a950 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
1a960 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
1a970 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
1a980 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
1a990 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
1a9a0 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
1a9b0 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
1a9c0 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
1a9d0 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
1a9e0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a9f0 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
1aa00 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
1aa10 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
1aa20 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
1aa30 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
1aa40 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
1aa50 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
1aa60 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
1aa70 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
1aa80 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1aa90 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
1aaa0 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1aab0 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
1aac0 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
1aad0 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
1aae0 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
1aaf0 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
1ab00 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69  8)|(x)[3]).#defi
1ab10 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54  ne FOUR_BYTE_INT
1ab20 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69  (x) (16777216*(i
1ab30 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
1ab40 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
1ab50 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
1ab60 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
1ab70 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
1ab80 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
1ab90 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
1aba0 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
1abb0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1abc0 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
1abd0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1abe0 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a   bytes read..**.
1abf0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ac00 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1ac10 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  as two separate 
1ac20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72  routines for per
1ac30 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
1ac40 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20   few cases that 
1ac50 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61  require local va
1ac60 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b  riables are brok
1ac70 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  en out into a se
1ac80 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e  parate.** routin
1ac90 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73  e so that in mos
1aca0 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72  t cases the over
1acb0 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74  head of moving t
1acc0 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  he stack pointer
1acd0 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a  .** is avoided..
1ace0 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53  */ .static u32 S
1acf0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
1ad00 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
1ad10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ad20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
1ad30 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
1ad40 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
1ad50 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
1ad60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1ad70 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
1ad80 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
1ad90 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1adb0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
1adc0 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
1add0 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46  /.){.  u64 x = F
1ade0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
1adf0 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f  f);.  u32 y = FO
1ae00 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
1ae10 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33  +4);.  x = (x<<3
1ae20 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65  2) + y;.  if( se
1ae30 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
1ae40 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1ae50 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37  OF: R-29851-5227
1ae60 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  2 Value is a big
1ae70 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20  -endian 64-bit. 
1ae80 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1ae90 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1aea0 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  /.    pMem->u.i 
1aeb0 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1aec0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1aed0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74  EM_Int;.    test
1aee0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1aef0 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
1af00 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1af10 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20  : R-57343-49114 
1af20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1af30 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32  ndian IEEE 754-2
1af40 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  008 64-bit.    *
1af50 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
1af60 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20   number. */.#if 
1af70 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
1af80 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1af90 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1afa0 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20  G_POINT).    /* 
1afb0 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
1afc0 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
1afd0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
1afe0 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
1aff0 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
1b000 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
1b010 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
1b020 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
1b030 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
1b040 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
1b050 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
1b060 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
1b070 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a  .    ** endian..
1b080 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
1b090 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
1b0a0 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
1b0b0 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74  0)<<32;.    stat
1b0c0 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
1b0d0 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36  r1 = 1.0;.    u6
1b0e0 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73  4 t2 = t1;.    s
1b0f0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1b100 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73  oat(t2);.    ass
1b110 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
1b120 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
1b130 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
1b140 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
1b150 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
1b160 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
1b170 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
1b180 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  ->u.r)==8 );.   
1b190 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1b1a0 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65  Float(x);.    me
1b1b0 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c  mcpy(&pMem->u.r,
1b1c0 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
1b1d0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
1b1e0 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
1b1f0 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d  pMem->u.r) ? MEM
1b200 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
1b210 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38  ;.  }.  return 8
1b220 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56  ;.}.u32 sqlite3V
1b230 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
1b240 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b250 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
1b260 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
1b270 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
1b280 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1b290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b2a0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
1b2b0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
1b2c0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
1b2f0 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
1b300 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
1b310 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1b320 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 7b  {.    case 10: {
1b330 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65   /* Internal use
1b340 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68   only: NULL with
1b350 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20   virtual table. 
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1b370 20 55 50 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67   UPDATE no-chang
1b380 65 20 66 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20  e flag set */.  
1b390 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1b3a0 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a  = MEM_Null|MEM_Z
1b3b0 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ero;.      pMem-
1b3c0 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d  >n = 0;.      pM
1b3d0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b  em->u.nZero = 0;
1b3e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b3f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 31 3a    }.    case 11:
1b400 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
1b410 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
1b420 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
1b430 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  /* Null */.     
1b440 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b450 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56   R-24078-09375 V
1b460 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20  alue is a NULL. 
1b470 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
1b480 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
1b490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b4a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
1b4b0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
1b4c0 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d  NCE-OF: R-44885-
1b4d0 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61  25196 Value is a
1b4e0 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d  n 8-bit twos-com
1b4f0 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a  plement.      **
1b500 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1b510 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f     pMem->u.i = O
1b520 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  NE_BYTE_INT(buf)
1b530 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1b540 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1b550 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b560 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1b570 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b580 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1b590 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1b5a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1b5b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1b5c0 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32  OF: R-49794-3502
1b5d0 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  6 Value is a big
1b5e0 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20  -endian 16-bit. 
1b5f0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1b600 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1b610 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1b620 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  u.i = TWO_BYTE_I
1b630 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1b640 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1b650 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1b660 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1b670 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1b680 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
1b690 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
1b6a0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1b6b0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1b6c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38  IDENCE-OF: R-378
1b6d0 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69  39-54301 Value i
1b6e0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32  s a big-endian 2
1b6f0 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  4-bit.      ** t
1b700 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1b710 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1b720 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52   pMem->u.i = THR
1b730 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  EE_BYTE_INT(buf)
1b740 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1b750 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1b760 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b770 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1b780 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
1b790 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
1b7a0 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
1b7b0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1b7c0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1b7d0 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37  OF: R-01849-2607
1b7e0 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  9 Value is a big
1b7f0 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20  -endian 32-bit. 
1b800 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1b810 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1b820 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1b830 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1b840 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66  INT(buf);.#ifdef
1b850 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20   __HP_cc .      
1b860 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61  /* Work around a
1b870 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20   sign-extension 
1b880 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f  bug in the HP co
1b890 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58  mpiler for HP/UX
1b8a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75   */.      if( bu
1b8b0 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d  f[0]&0x80 ) pMem
1b8c0 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66  ->u.i |= 0xfffff
1b8d0 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23  fff80000000LL;.#
1b8e0 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d  endif.      pMem
1b8f0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1b900 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1b910 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1b920 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
1b930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b940 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
1b950 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1b960 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1b970 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d  NCE-OF: R-50385-
1b980 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61  09674 Value is a
1b990 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62   big-endian 48-b
1b9a0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1b9b0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1b9c0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1b9d0 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
1b9e0 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20  YTE_UINT(buf+2) 
1b9f0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1ba00 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75  *TWO_BYTE_INT(bu
1ba10 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1ba20 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1ba30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ba40 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1ba50 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
1ba60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1ba70 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
1ba80 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1ba90 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
1baa0 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
1bab0 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  oint */.      /*
1bac0 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c   These use local
1bad0 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64   variables, so d
1bae0 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61  o them in a sepa
1baf0 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20  rate routine.   
1bb00 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68     ** to avoid h
1bb10 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68  aving to move th
1bb20 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20  e frame pointer 
1bb30 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1bb40 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  se */.      retu
1bb50 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66  rn serialGet(buf
1bb60 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65  ,serial_type,pMe
1bb70 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  m);.    }.    ca
1bb80 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
1bb90 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
1bba0 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
1bbb0 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  er 1 */.      /*
1bbc0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1bbd0 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75  12976-22893 Valu
1bbe0 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
1bbf0 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   0. */.      /* 
1bc00 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1bc10 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65  8143-12121 Value
1bc20 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
1bc30 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  1. */.      pMem
1bc40 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
1bc50 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
1bc60 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1bc70 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
1bc80 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
1bc90 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
1bca0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1bcb0 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c  -14606-31564 Val
1bcc0 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61  ue is a BLOB tha
1bcd0 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79  t is (N-12)/2 by
1bce0 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  tes in.      ** 
1bcf0 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a  length..      **
1bd00 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1bd10 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75  28401-00140 Valu
1bd20 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e  e is a string in
1bd30 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   the text encodi
1bd40 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ng and.      ** 
1bd50 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69  (N-13)/2 bytes i
1bd60 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20  n length. */.   
1bd70 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1bd80 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20  u16 aFlag[] = { 
1bd90 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68  MEM_Blob|MEM_Eph
1bda0 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  em, MEM_Str|MEM_
1bdb0 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70  Ephem };.      p
1bdc0 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
1bdd0 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
1bde0 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  ->n = (serial_ty
1bdf0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
1be00 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46  pMem->flags = aF
1be10 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26  lag[serial_type&
1be20 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1];.      return
1be30 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a   pMem->n;.    }.
1be40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1be50 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  }./*.** This rou
1be60 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
1be70 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
1be80 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
1be90 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
1bea0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
1beb0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
1bec0 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
1bed0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
1bee0 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
1bef0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1bf00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
1bf10 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
1bf20 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
1bf30 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
1bf40 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
1bf50 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
1bf60 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
1bf70 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
1bf80 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
1bf90 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
1bfa0 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
1bfb0 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
1bfc0 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
1bfd0 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
1bfe0 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
1bff0 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
1c000 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
1c010 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
1c020 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
1c030 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
1c040 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
1c050 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
1c060 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
1c070 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
1c080 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
1c090 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1c0a0 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
1c0b0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1c0c0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1c0d0 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
1c0e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
1c0f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
1c100 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
1c110 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
1c120 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c140 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1c150 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29   the record */.)
1c160 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
1c170 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
1c180 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
1c190 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
1c1a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c1d0 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
1c1e0 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42  d for *p */.  nB
1c1f0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
1c200 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
1c210 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
1c220 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  m)*(pKeyInfo->nK
1c230 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20  eyField+1);.  p 
1c240 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1c250 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
1c260 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
1c270 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  >db, nByte);.  i
1c280 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
1c290 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ;.  p->aMem = (M
1c2a0 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
1c2b0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
1c2c0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
1c2d0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1c2e0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1c2f0 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
1c300 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1c310 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
1c320 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1c330 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1c340 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1c350 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1c360 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1c370 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1c380 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1c390 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c3a0 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1c3b0 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1c3c0 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1c3d0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1c3e0 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1c3f0 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1c400 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c410 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1c420 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1c430 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1c440 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1c450 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1c460 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1c470 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1c480 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1c490 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1c4a0 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1c4b0 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1c4c0 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1c4d0 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1c4e0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1c4f0 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1c500 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1c510 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1c520 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1c530 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1c540 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
1c550 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
1c560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c570 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1c580 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1c590 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1c5a0 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c5c0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1c5d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1c5e0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1c5f0 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1c600 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1c610 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1c620 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1c630 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1c640 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1c650 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1c660 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1c670 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1c680 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b  x<szHdr && d<=nK
1c690 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1c6a0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1c6b0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1c6c0 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1c6d0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1c6e0 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1c6f0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1c700 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1c710 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1c720 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1c730 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1c740 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1c750 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1c760 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1c770 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  alloc = 0;.    p
1c780 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20  Mem->z = 0;.    
1c790 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1c7a0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1c7b0 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1c7c0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1c7d0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1c7e0 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1c7f0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
1c800 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1c810 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29  >nKeyField + 1 )
1c820 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1c830 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  u;.}..#ifdef SQL
1c840 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1c850 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1c860 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78  mpares two index
1c870 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64   or table record
1c880 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d   keys in the sam
1c890 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20  e way.** as the 
1c8a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c8b0 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69  dCompare() routi
1c8c0 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52  ne. Unlike VdbeR
1c8d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a  ecordCompare(),.
1c8e0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1c8f0 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e   deserializes an
1c900 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65  d compares value
1c910 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  s using the.** s
1c920 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1c930 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Get() and sqlite
1c940 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75  3MemCompare() fu
1c950 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75  nctions. It is u
1c960 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  sed.** in assert
1c970 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
1c980 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1c990 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20   optimized code 
1c9a0 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  in.** sqlite3Vdb
1c9b0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1c9c0 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73   returns results
1c9d0 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20   with these two 
1c9e0 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a  primitives..**.*
1c9f0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ca00 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
1ca10 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75  omparison is equ
1ca20 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72  ivalent to desir
1ca30 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74  edResult..** Ret
1ca40 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
1ca50 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65  re is a disagree
1ca60 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1ca70 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1ca80 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e  mpareDebug(.  in
1ca90 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1caa0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1cab0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  eft key */.  con
1cac0 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  st UnpackedRecor
1cad0 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69  d *pPKey2, /* Ri
1cae0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1caf0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20   desiredResult  
1cb00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1cb10 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a  rrect answer */.
1cb20 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1cb30 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1cb40 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1cb50 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1cb60 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
1cb70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
1cb80 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1cb90 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
1cba0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1cbb0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1cbc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1cbd0 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
1cbe0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
1cbf0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
1cc00 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1cc10 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1cc20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1cc30 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
1cc40 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
1cc50 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
1cc60 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
1cc70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  KeyInfo;.  if( p
1cc80 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29  KeyInfo->db==0 )
1cc90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
1cca0 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1ccb0 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
1ccc0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1ccd0 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
1cce0 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
1ccf0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
1cd00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1cd10 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
1cd20 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1cd30 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1cd40 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1cd50 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1cd60 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
1cd70 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
1cd80 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
1cd90 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
1cda0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1cdb0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
1cdc0 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
1cdd0 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
1cde0 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
1cdf0 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
1ce00 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
1ce10 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
1ce20 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
1ce30 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
1ce40 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
1ce50 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
1ce60 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
1ce70 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
1ce80 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
1ce90 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
1cea0 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
1ceb0 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
1cec0 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
1ced0 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
1cee0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
1cef0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
1cf00 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
1cf10 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
1cf20 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
1cf30 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
1cf40 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
1cf50 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
1cf60 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1cf70 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
1cf80 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1cf90 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69  y1, szHdr1);.  i
1cfa0 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20  f( szHdr1>98307 
1cfb0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1cfc0 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20  CORRUPT;.  d1 = 
1cfd0 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74  szHdr1;.  assert
1cfe0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  ( pKeyInfo->nAll
1cff0 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1d000 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54  Field || CORRUPT
1d010 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
1d020 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1d030 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1d040 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1d050 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20  nKeyField>0 );. 
1d060 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1d070 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1d080 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1d090 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1d0a0 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
1d0b0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
1d0c0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
1d0d0 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
1d0e0 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
1d0f0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
1d100 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
1d110 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20  l_type1 );..    
1d120 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1d130 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b  here is enough k
1d140 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69  ey space remaini
1d150 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20  ng to avoid.    
1d160 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72  ** a buffer over
1d170 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73  read.  The "d1+s
1d180 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73  erial_type1+2" s
1d190 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  ubexpression wil
1d1a0 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  l.    ** always 
1d1b0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
1d1c0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1d1d0 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72  amount of requir
1d1e0 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20  ed key space..  
1d1f0 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70    ** Use that ap
1d200 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61  proximation to a
1d210 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78  void the more ex
1d220 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a  pensive call to.
1d230 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
1d240 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1d250 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ) in the common 
1d260 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
1d270 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74   if( d1+serial_t
1d280 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79  ype1+2>(u32)nKey
1d290 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c  1.     && d1+sql
1d2a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1d2b0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1d2c0 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a  e1)>(u32)nKey1 .
1d2d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
1d2e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d2f0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1d300 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
1d310 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1d320 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1d330 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1d340 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1d350 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
1d360 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
1d370 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
1d380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
1d390 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
1d3a0 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
1d3b0 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
1d3c0 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  l[i]);.    if( r
1d3d0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
1d3e0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1d3f0 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
1d400 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
1d410 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  */.      if( pKe
1d420 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1d430 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1d440 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e  rc = -rc;  /* In
1d450 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20  vert the result 
1d460 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72  for DESC sort or
1d470 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  der. */.      }.
1d480 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67        goto debug
1d490 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20  CompareEnd;.    
1d4a0 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68  }.    i++;.  }wh
1d4b0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
1d4c0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1d4d0 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ield );..  /* No
1d4e0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1d4f0 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
1d500 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
1d510 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
1d520 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1d530 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
1d540 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
1d550 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
1d560 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
1d570 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
1d580 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
1d590 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
1d5a0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d5b0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1d5c0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1d5d0 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1d5e0 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
1d5f0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1d600 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1d610 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1d620 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1d630 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1d640 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1d650 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72  * value.  */.  r
1d660 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  c = pPKey2->defa
1d670 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f  ult_rc;..debugCo
1d680 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20  mpareEnd:.  if( 
1d690 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30  desiredResult==0
1d6a0 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75   && rc==0 ) retu
1d6b0 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1d6c0 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72  redResult<0 && r
1d6d0 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c<0 ) return 1;.
1d6e0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1d6f0 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20  ult>0 && rc>0 ) 
1d700 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1d710 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1d720 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65  urn 1;.  if( pKe
1d730 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1d740 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1d750 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
1d760 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1d770 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1d780 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1d790 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28  mber of fields (
1d7a0 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20  a.k.a. columns) 
1d7b0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69  in the record gi
1d7c0 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e  ven by.** pKey,n
1d7d0 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79  Key.  The verify
1d7e0 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74   that this count
1d7f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1d800 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
1d810 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20   limit given by 
1d820 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1d830 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
1d840 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  is constraint is
1d850 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20   not satisfied, 
1d860 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1d870 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20  e high-speed.** 
1d880 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d890 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52  eInt() and vdbeR
1d8a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1d8b0 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69  ng() routines wi
1d8c0 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63  ll.** not work c
1d8d0 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68  orrectly.  If th
1d8e0 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72  is assert() ever
1d8f0 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61   fires, it proba
1d900 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  bly means.** tha
1d910 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b  t the KeyInfo.nK
1d920 65 79 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e  eyField or KeyIn
1d930 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c  fo.nAllField val
1d940 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65  ues were compute
1d950 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79  d.** incorrectly
1d960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d970 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1d980 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1d990 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  s(.  int nKey, c
1d9a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1d9b0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
1d9c0 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20   to verify */ . 
1d9d0 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a   const KeyInfo *
1d9e0 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f  pKeyInfo       /
1d9f0 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77  * Compare size w
1da00 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f  ith this KeyInfo
1da10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69   */.){.  int nFi
1da20 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73  eld = 0;.  u32 s
1da30 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b  zHdr;.  u32 idx;
1da40 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a  .  u32 notUsed;.
1da50 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1da60 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1da70 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1da80 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28  ar*)pKey;..  if(
1da90 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1daa0 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65  turn;.  idx = ge
1dab0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1dac0 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74  szHdr);.  assert
1dad0 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  ( nKey>=0 );.  a
1dae0 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75  ssert( szHdr<=(u
1daf0 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69  32)nKey );.  whi
1db00 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b  le( idx<szHdr ){
1db10 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1db20 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78  arint32(aKey+idx
1db30 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20  , notUsed);.    
1db40 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20  nField++;.  }.  
1db50 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c  assert( nField <
1db60 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  = pKeyInfo->nAll
1db70 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  Field );.}.#else
1db80 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73  .# define vdbeAs
1db90 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1dba0 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43  thinLimits(A,B,C
1dbb0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1dbc0 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
1dbd0 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
1dbe0 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
1dbf0 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
1dc00 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
1dc10 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1dc20 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
1dc30 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
1dc40 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
1dc50 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
1dc60 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
1dc70 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1dc80 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
1dc90 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
1dca0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
1dcb0 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
1dcc0 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
1dcd0 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
1dce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1dcf0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1dd00 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
1dd10 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
1dd20 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
1dd30 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1dd40 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
1dd50 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1dd60 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
1dd70 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
1dd80 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1dd90 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
1dda0 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
1ddb0 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
1ddc0 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
1ddd0 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
1dde0 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
1ddf0 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
1de00 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1de10 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
1de20 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
1de30 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1de40 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
1de50 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
1de60 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
1de70 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
1de80 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
1de90 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20  1, *v2;.    Mem 
1dea0 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
1deb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1dec0 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
1ded0 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1dee0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1def0 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
1df00 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1df10 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1df20 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1df30 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
1df40 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
1df50 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1df60 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
1df70 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
1df80 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
1df90 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1dfa0 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
1dfb0 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1dfc0 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v2 = sqlite3Valu
1dfd0 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1dfe0 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c  alue*)&c2, pColl
1dff0 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20  ->enc);.    if( 
1e000 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1e010 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
1e020 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
1e030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1e040 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  PT;.      rc = 0
1e050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e060 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
1e070 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1e080 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e  , c1.n, v1, c2.n
1e090 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , v2);.    }.   
1e0a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e0b0 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1e0c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e0d0 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1e0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1e0f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
1e100 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72  ut pBlob is guar
1e110 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 42  anteed to be a B
1e120 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20  lob that is not 
1e130 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d  marked.** with M
1e140 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e  EM_Zero.  Return
1e150 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c   true if it coul
1e160 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62  d be a zero-blob
1e170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e180 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20  isAllZero(const 
1e190 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
1e1a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1e1b0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
1e1c0 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72      if( z[i] ) r
1e1d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1e1e0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1e1f0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c  * Compare two bl
1e200 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  obs.  Return neg
1e210 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1e220 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1e230 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73  first.** is less
1e240 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1e250 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1e260 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73   the second, res
1e270 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66  pectively..** If
1e280 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70   one blob is a p
1e290 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
1e2a0 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f  er, then the sho
1e2b0 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73  rter is the less
1e2c0 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  or..*/.static SQ
1e2d0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
1e2e0 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  t sqlite3BlobCom
1e2f0 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1e300 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  pB1, const Mem *
1e310 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  pB2){.  int c;. 
1e320 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e   int n1 = pB1->n
1e330 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32  ;.  int n2 = pB2
1e340 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  ->n;..  /* It is
1e350 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
1e360 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74  e a Blob value t
1e370 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e  hat has some non
1e380 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20  -zero content.  
1e390 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  ** followed by z
1e3a0 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75  ero content.  Bu
1e3b0 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65  t that only come
1e3c0 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66  s up for Blobs f
1e3d0 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ormed.  ** by th
1e3e0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1e3f0 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68  opcode, and such
1e400 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74   Blobs never get
1e410 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
1e420 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  * sqlite3MemComp
1e430 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  are(). */.  asse
1e440 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20  rt( (pB1->flags 
1e450 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1e460 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73  | n1==0 );.  ass
1e470 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73  ert( (pB2->flags
1e480 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1e490 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69  || n2==0 );..  i
1e4a0 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70  f( (pB1->flags|p
1e4b0 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  B2->flags) & MEM
1e4c0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28  _Zero ){.    if(
1e4d0 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42   pB1->flags & pB
1e4e0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1e4f0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ero ){.      ret
1e500 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1e510 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1e520 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1e530 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1e540 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
1e550 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32  ( !isAllZero(pB2
1e560 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72  ->z, pB2->n) ) r
1e570 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1e580 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a  return pB1->u.nZ
1e590 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65  ero - n2;.    }e
1e5a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
1e5b0 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a  isAllZero(pB1->z
1e5c0 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75  , pB1->n) ) retu
1e5d0 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1e5e0 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e  urn n1 - pB2->u.
1e5f0 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  nZero;.    }.  }
1e600 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  .  c = memcmp(pB
1e610 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31  1->z, pB2->z, n1
1e620 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a  >n2 ? n2 : n1);.
1e630 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1e640 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20   c;.  return n1 
1e650 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  - n2;.}../*.** D
1e660 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1e670 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1e680 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1e690 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1e6a0 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1e6b0 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1e6c0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1e6d0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1e6e0 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1e6f0 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1e700 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1e710 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1e720 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1e730 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1e740 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1e750 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1e760 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1e770 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1e780 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1e790 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1e7a0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1e7b0 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1e7c0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1e7d0 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1e7e0 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1e7f0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e800 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1e810 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1e820 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1e830 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1e840 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32  1;.    if( r>922
1e850 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
1e860 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1e870 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a      y = (i64)r;.
1e880 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65      if( i<y ) re
1e890 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1e8a0 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66   i>y ){.      if
1e8b0 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  ( y==SMALLEST_IN
1e8c0 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72  T64 && r>0.0 ) r
1e8d0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1e8e0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d  return +1;.    }
1e8f0 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65  .    s = (double
1e900 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20  )i;.    if( s<r 
1e910 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1e920 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72   if( s>r ) retur
1e930 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1e940 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1e950 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
1e960 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
1e970 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
1e980 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
1e990 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
1e9a0 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
1e9b0 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
1e9c0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1e9d0 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
1e9e0 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
1e9f0 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
1ea00 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
1ea10 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
1ea20 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
1ea30 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
1ea40 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
1ea50 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
1ea60 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69  d by the collati
1ea70 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70  ng.** sequence p
1ea80 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79  Coll and finally
1ea90 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20   blob's ordered 
1eaa0 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a  by memcmp()..**.
1eab0 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  ** Two NULL valu
1eac0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1ead0 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20  d equal by this 
1eae0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1eaf0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1eb00 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  re(const Mem *pM
1eb10 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  em1, const Mem *
1eb20 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c  pMem2, const Col
1eb30 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
1eb40 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
1eb50 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
1eb60 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
1eb70 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
1eb80 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
1eb90 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
1eba0 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
1ebb0 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
1ebc0 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
1ebd0 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
1ebe0 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
1ebf0 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
1ec00 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
1ec10 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
1ec20 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
1ec30 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
1ec40 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1ec50 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
1ec60 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
1ec70 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
1ec80 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ll);.  }..  /* A
1ec90 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
1eca0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73  he two values is
1ecb0 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20   a number.  */. 
1ecc0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1ecd0 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ags&(MEM_Int|MEM
1ece0 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66  _Real) ){.    if
1ecf0 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1ed00 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1ed10 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1ed20 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
1ed30 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1ed40 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1ed50 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
1ed60 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1ed70 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1ed80 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1ed90 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20   & MEM_Real)!=0 
1eda0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1edb0 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d  m1->u.r < pMem2-
1edc0 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.r ) return -1
1edd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1ede0 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.r > pMem2->
1edf0 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.r ) return +1;
1ee00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1ee10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1ee20 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f1&MEM_Int)!=0 )
1ee30 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1ee40 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1ee50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1ee60 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1ee70 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69  mpare(pMem1->u.i
1ee80 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20  , pMem2->u.r);. 
1ee90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1eea0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1eeb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1eec0 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
1eed0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1eee0 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21  f( (f2&MEM_Int)!
1eef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1ef00 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74  turn -sqlite3Int
1ef10 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1ef20 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e  m2->u.i, pMem1->
1ef30 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1ef40 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1ef50 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1ef60 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b    }.    return +
1ef70 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1ef80 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  one value is a s
1ef90 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74  tring and the ot
1efa0 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  her is a blob, t
1efb0 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  he string is les
1efc0 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1efd0 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d  are strings, com
1efe0 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63  pare using the c
1eff0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1f000 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ns..  */.  if( c
1f010 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1f020 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28  M_Str ){.    if(
1f030 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f1 & MEM_Str)=
1f040 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1f050 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1f060 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74  if( (f2 & MEM_St
1f070 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1f080 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1f090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1f0a0 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e  m1->enc==pMem2->
1f0b0 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62  enc || pMem1->db
1f0c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1f0d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
1f0e0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1f0f0 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
1f100 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
1f110 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
1f120 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
1f130 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
1f140 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1f150 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1f160 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
1f170 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
1f180 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
1f190 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
1f1a0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1f1b0 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
1f1c0 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
1f1d0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
1f1e0 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
1f1f0 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
1f200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1f210 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
1f220 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
1f230 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1f240 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1f250 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1f260 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
1f270 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Coll, 0);.    }.
1f280 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c      /* If a NULL
1f290 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73   pointer was pas
1f2a0 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61  sed as the colla
1f2b0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c  te function, fal
1f2c0 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  l through.    **
1f2d0 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73   to the blob cas
1f2e0 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70  e and use memcmp
1f2f0 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20  ().  */.  }. .  
1f300 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d  /* Both values m
1f310 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43  ust be blobs.  C
1f320 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d  ompare using mem
1f330 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74  cmp().  */.  ret
1f340 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  urn sqlite3BlobC
1f350 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d  ompare(pMem1, pM
1f360 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  em2);.}.../*.** 
1f370 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1f380 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1f390 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1f3a0 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74  serial-type that
1f3b0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1f3c0 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  to an integer - 
1f3d0 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65  all values betwe
1f3e0 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75  en 1 and 9 inclu
1f3f0 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20  sive .** except 
1f400 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f  7. The second po
1f410 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1f420 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69   containing an i
1f430 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20  nteger value.** 
1f440 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72  serialized accor
1f450 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74  ding to serial_t
1f460 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ype. This functi
1f470 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a  on deserializes.
1f480 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ** and returns t
1f490 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  he value..*/.sta
1f4a0 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f  tic i64 vdbeReco
1f4b0 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20  rdDecodeInt(u32 
1f4c0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e  serial_type, con
1f4d0 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
1f4e0 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28  u32 y;.  assert(
1f4f0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28   CORRUPT_DB || (
1f500 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26  serial_type>=1 &
1f510 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39  & serial_type<=9
1f520 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21   && serial_type!
1f530 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =7) );.  switch(
1f540 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1f550 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
1f560 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65  case 1:.      te
1f570 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1f580 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1f590 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  turn ONE_BYTE_IN
1f5a0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1f5b0 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 2:.      testc
1f5c0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1f5d0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1f5e0 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  n TWO_BYTE_INT(a
1f5f0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33  Key);.    case 3
1f600 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1f610 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1f620 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1f630 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1f640 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  ey);.    case 4:
1f650 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f660 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1f670 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
1f680 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1f690 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f6a0 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1f6b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1f6c0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f6d0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1f6e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1f6f0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1f700 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1f710 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1f720 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1f730 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1f740 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46  .      u64 x = F
1f750 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1f760 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1f770 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1f780 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  0 );.      x = (
1f790 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1f7a0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1f7b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1f7c0 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20  64)*(i64*)&x;.  
1f7d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1f7e0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  n (serial_type -
1f7f0 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   8);.}../*.** Th
1f800 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1f810 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
1f820 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
1f830 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
1f840 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
1f850 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
1f860 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
1f870 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
1f880 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1f890 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
1f8a0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1f8b0 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
1f8c0 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
1f8d0 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
1f8e0 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
1f8f0 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
1f900 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1f910 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
1f920 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
1f930 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
1f940 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
1f950 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
1f960 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
1f970 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
1f980 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ord..**.** If ar
1f990 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20  gument bSkip is 
1f9a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20  non-zero, it is 
1f9b0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1f9c0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1f9d0 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ady.** determine
1f9e0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1f9f0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b   fields of the k
1fa00 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a  eys are equal..*
1fa10 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
1fa20 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
1fa30 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
1fa40 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
1fa50 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20  lds. If all .** 
1fa60 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65  fields that appe
1fa70 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20  ar in both keys 
1fa80 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
1fa90 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1faa0 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  rc is .** return
1fab0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  ed..**.** If dat
1fac0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1fad0 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20   is discovered, 
1fae0 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  set pPKey2->errC
1faf0 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  ode to .** SQLIT
1fb00 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65  E_CORRUPT and re
1fb10 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f  turn 0. If an OO
1fb20 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
1fb30 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65  ntered, .** pPKe
1fb40 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73  y2->errCode is s
1fb50 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1fb60 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73  EM and, if it is
1fb70 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a   not NULL, the.*
1fb80 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  * malloc-failed 
1fb90 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61  flag set on data
1fba0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b  base handle (pPK
1fbb0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
1fbc0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
1fbd0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1fbe0 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69  areWithSkip(.  i
1fbf0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1fc00 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
1fc10 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1fc20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1fc30 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20  pPKey2,         
1fc40 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1fc50 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20    int bSkip     
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b    /* If true, sk
1fc80 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ip the first fie
1fc90 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ld */.){.  u32 d
1fca0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1fcb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1fcc0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1fcd0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1fce0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1fcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1fd10 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c  dex of next fiel
1fd20 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  d to compare */.
1fd30 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
1fd60 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79  ord header in by
1fd70 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  tes */.  u32 idx
1fd80 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1fd90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1fda0 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65  et of first type
1fdb0 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1fdc0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1fdf0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d  */.  Mem *pRhs =
1fe00 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20   pPKey2->aMem;  
1fe10 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65       /* Next fie
1fe20 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20  ld of pPKey2 to 
1fe30 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79  compare */.  Key
1fe40 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1fe50 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1fe60 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1fe70 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1fe80 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1fe90 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1fea0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1feb0 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1fec0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1fed0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1fee0 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1fef0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1ff00 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1ff10 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1ff20 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
1ff30 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
1ff40 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
1ff50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
1ff60 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
1ff70 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
1ff80 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
1ff90 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
1ffa0 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
1ffb0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1ffc0 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
1ffd0 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
1ffe0 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
1fff0 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
20000 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
20010 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
20020 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
20030 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
20040 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
20050 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
20060 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
20070 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
20080 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
20090 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
200a0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
200b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
200c0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
200d0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
200e0 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
200f0 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
20100 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
20110 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
20120 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
20130 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
20140 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
20150 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
20160 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
20170 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  ld .       || CO
20180 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
20190 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
201a0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
201b0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
201c0 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
201d0 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30  nfo->nKeyField>0
201e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
201f0 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
20200 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
20210 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
20220 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
20230 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
20240 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
20250 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
20260 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  t ){.      seria
20270 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
20280 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  dx1];.      test
20290 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
202a0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
202b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
202c0 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  10 ){.        rc
202d0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
202e0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
202f0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
20300 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
20310 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
20320 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
20330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
20340 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
20350 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
20360 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
20370 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49    rc = -sqlite3I
20380 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
20390 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75  Rhs->u.i, mem1.u
203a0 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
203b0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68  {.        i64 lh
203c0 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65  s = vdbeRecordDe
203d0 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74  codeInt(serial_t
203e0 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29  ype, &aKey1[d1])
203f0 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68  ;.        i64 rh
20400 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  s = pRhs->u.i;. 
20410 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
20420 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
20430 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
20440 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
20450 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
20460 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
20470 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20480 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
20490 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  real */.    else
204a0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
204b0 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
204c0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
204d0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
204e0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
204f0 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
20500 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
20510 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74  ypes 12 or great
20520 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61  er are strings a
20530 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65  nd blobs (greate
20540 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a  r than.        *
20550 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65  * numbers). Type
20560 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20  s 10 and 11 are 
20570 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72  currently "reser
20580 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a  ved for future .
20590 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c          ** use",
205a0 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72   so it doesn't r
205b0 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61  eally matter wha
205c0 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
205d0 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20   comparing.     
205e0 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75     ** them to nu
205f0 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72  mberic values ar
20600 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
20610 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
20620 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
20630 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
20640 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
20650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20660 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
20670 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
20680 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
20690 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
206a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
206b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
206c0 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d  ( mem1.u.r<pRhs-
206d0 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
206e0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
206f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
20700 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e   mem1.u.r>pRhs->
20710 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
20720 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
20730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74   rc = sqlite3Int
20760 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d  FloatCompare(mem
20770 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72  1.u.i, pRhs->u.r
20780 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20790 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
207a0 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
207b0 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
207c0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
207d0 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
207e0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
207f0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
20800 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
20810 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
20820 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
20830 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
20840 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
20850 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
20860 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
20870 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
20880 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20890 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
208a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
208b0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
208c0 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
208d0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
208e0 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
208f0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
20900 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
20910 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
20920 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
20930 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
20940 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
20950 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
20960 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
20970 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
20980 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20990 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
209a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
209b0 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
209c0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
209d0 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
209e0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
209f0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
20a00 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
20a10 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
20a20 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
20a30 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
20a40 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
20a50 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
20a60 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
20a70 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
20a80 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
20a90 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
20ab0 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
20ac0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
20ad0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
20ae0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
20af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20b00 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
20b10 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
20b20 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
20b30 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
20b40 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
20b50 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
20b60 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
20b70 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
20b80 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
20b90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20ba0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
20bb0 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
20bc0 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
20bd0 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
20be0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52 68      assert( (pRh
20bf0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  s->flags & MEM_Z
20c00 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d  ero)==0 || pRhs-
20c10 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67  >n==0 );.      g
20c20 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
20c30 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
20c40 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
20c50 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
20c60 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
20c70 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
20c80 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  12 || (serial_ty
20c90 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
20ca0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
20cb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20cc0 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28      int nStr = (
20cd0 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
20ce0 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
20cf0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
20d00 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  r)==(unsigned)nK
20d10 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
20d20 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
20d30 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  r+1)==(unsigned)
20d40 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
20d50 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e   if( (d1+nStr) >
20d60 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
20d70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
20d80 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
20d90 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
20da0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
20db0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
20dd0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
20de0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
20df0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
20e00 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20  _Zero ){.       
20e10 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72     if( !isAllZer
20e20 6f 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26  o((const char*)&
20e30 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20  aKey1[d1],nStr) 
20e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
20e50 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
20e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20e70 20 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20      rc = nStr - 
20e80 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pRhs->u.nZero;. 
20e90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20ea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20eb0 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
20ec0 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e  IN(nStr, pRhs->n
20ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
20ee0 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
20ef0 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
20f00 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
20f10 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
20f20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a  nStr - pRhs->n;.
20f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20f40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
20f50 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20  RHS is null */. 
20f60 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73     else{.      s
20f70 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
20f80 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
20f90 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  rc = (serial_typ
20fa0 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e!=0);.    }..  
20fb0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
20fc0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
20fd0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
20fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20ff0 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -rc;.      }.  
21000 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65      assert( vdbe
21010 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
21020 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
21030 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a   pPKey2, rc) );.
21040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
21050 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
21060 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
21070 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
21080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21090 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  }..    i++;.    
210a0 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b  pRhs++;.    d1 +
210b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
210c0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
210d0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78  l_type);.    idx
210e0 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69  1 += sqlite3Vari
210f0 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  ntLen(serial_typ
21100 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  e);.  }while( id
21110 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48  x1<(unsigned)szH
21120 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
21130 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28  >nField && d1<=(
21140 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
21150 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
21160 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
21170 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
21180 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
21190 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
211a0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
211b0 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
211c0 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
211d0 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
211e0 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
211f0 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
21200 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
21210 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20  se(&mem1).  */. 
21220 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
21230 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
21240 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
21250 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20  ans that one or 
21260 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73  both of the keys
21270 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
21280 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
21290 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
212a0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
212b0 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
212c0 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
212d0 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
212e0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
212f0 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64  DB .       || vd
21300 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
21310 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
21320 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79  1, pPKey2, pPKey
21330 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a  2->default_rc) .
21340 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e         || pKeyIn
21350 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
21360 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65  iled.  );.  pPKe
21370 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
21380 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d    return pPKey2-
21390 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69  >default_rc;.}.i
213a0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
213b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69  cordCompare(.  i
213c0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
213d0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
213e0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
213f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
21400 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20  pPKey2          
21410 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
21420 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
21430 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21440 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
21450 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21460 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  2, 0);.}.../*.**
21470 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
21480 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
21490 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
214a0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
214b0 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
214c0 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
214d0 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
214e0 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28  n integer, and (
214f0 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d  b) the .** size-
21500 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
21510 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
21520 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
21530 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a  its in a single.
21540 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  ** byte (i.e. is
21550 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e   less than 128).
21560 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
21570 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62  concerns about b
21580 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c  uffer overreads,
21590 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
215a0 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e   only used.** on
215b0 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74   schemas where t
215c0 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64  he maximum valid
215d0 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
215e0 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73  63 bytes or less
215f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21600 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21610 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79  eInt(.  int nKey
21620 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
21630 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
21640 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
21650 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
21660 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
21670 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
21680 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f  u8 *aKey = &((co
21690 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a  nst u8*)pKey1)[*
216a0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
216b0 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20   & 0x3F];.  int 
216c0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28  serial_type = ((
216d0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29  const u8*)pKey1)
216e0 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  [1];.  int res;.
216f0 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78    u32 y;.  u64 x
21700 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34  ;.  i64 v;.  i64
21710 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73   lhs;..  vdbeAss
21720 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
21730 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
21740 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
21750 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73  pKeyInfo);.  ass
21760 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79  ert( (*(u8*)pKey
21770 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52  1)<=0x3F || CORR
21780 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74  UPT_DB );.  swit
21790 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
217a0 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b  ){.    case 1: {
217b0 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
217c0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
217d0 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54     lhs = ONE_BYT
217e0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
217f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
21800 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
21810 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21820 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
21830 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
21840 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
21850 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
21860 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21870 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
21880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
21890 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
218a0 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
218b0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
218c0 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  hs = THREE_BYTE_
218d0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
218e0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
218f0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21900 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21910 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
21920 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
21930 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
21940 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
21950 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36  .      lhs = (i6
21960 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
21970 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
21980 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
21990 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
219a0 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
219b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
219c0 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46  */.      lhs = F
219d0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
219e0 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
219f0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
21a00 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
21a10 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
21a20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21a30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21a40 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73  6: { /* 8-byte s
21a50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
21a60 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f  .      x = FOUR_
21a70 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
21a80 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
21a90 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
21aa0 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
21ab0 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29     lhs = *(i64*)
21ac0 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &x;.      testca
21ad0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
21ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21af0 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20      case 8: .   
21b00 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20     lhs = 0;.    
21b10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
21b20 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d  e 9:.      lhs =
21b30 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
21b40 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  ..    /* This ca
21b50 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f  se could be remo
21b60 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e  ved without chan
21b70 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ging the results
21b80 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20   of running.    
21b90 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e  ** this code. In
21ba0 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65  cluding it cause
21bb0 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74  s gcc to generat
21bc0 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63  e a faster switc
21bd0 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  h .    ** statem
21be0 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72  ent (since the r
21bf0 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74  ange of switch t
21c00 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74  argets now start
21c10 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20  s at zero and.  
21c20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f    ** is contiguo
21c30 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  us) but does not
21c40 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69   cause any dupli
21c50 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20  cate code to be 
21c60 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a  generated.    **
21c70 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76   (as gcc is clev
21c80 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d  er enough to com
21c90 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b  bine the two lik
21ca0 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20  e cases). Other 
21cb0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72  .    ** compiler
21cc0 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c  s might be simil
21cd0 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  ar.  */ .    cas
21ce0 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20  e 0: case 7:.   
21cf0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
21d00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
21d10 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
21d20 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64   pPKey2);..    d
21d30 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
21d40 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
21d50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
21d60 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
21d70 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  y2);.  }..  v = 
21d80 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
21d90 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73  u.i;.  if( v>lhs
21da0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
21db0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73  Key2->r1;.  }els
21dc0 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20  e if( v<lhs ){. 
21dd0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21de0 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r2;.  }else if(
21df0 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
21e00 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
21e10 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
21e20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
21e30 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20   equal. Compare 
21e40 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20  the trailing .  
21e50 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f    ** fields.  */
21e60 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
21e70 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21e80 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
21e90 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21ea0 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
21eb0 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
21ec0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
21ed0 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
21ee0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
21ef0 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a  o trailing.    *
21f00 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e  * fields. Return
21f10 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
21f20 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  _rc in this case
21f30 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70  . */.    res = p
21f40 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
21f50 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  c;.    pPKey2->e
21f60 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  qSeen = 1;.  }..
21f70 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
21f80 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
21f90 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21fa0 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20  PKey2, res) );. 
21fb0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
21fc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
21fd0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
21fe0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
21ff0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22000 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
22010 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
22020 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
22030 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68   is a string, th
22040 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74  at (b) the first
22050 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74   field.** uses t
22060 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
22070 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64  uence BINARY and
22080 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69   (c) that the si
22090 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
220a0 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73  int .** at the s
220b0 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
220c0 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
220d0 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a  single byte..*/.
220e0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
220f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
22100 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ng(.  int nKey1,
22110 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
22120 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
22130 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
22140 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
22150 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
22160 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
22170 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
22180 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e   u8*)pKey1;.  in
22190 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20  t serial_type;. 
221a0 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73   int res;..  ass
221b0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65  ert( pPKey2->aMe
221c0 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  m[0].flags & MEM
221d0 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73  _Str );.  vdbeAs
221e0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
221f0 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
22200 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
22210 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65  >pKeyInfo);.  ge
22220 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
22230 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [1], serial_type
22240 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  );.  if( serial_
22250 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72  type<12 ){.    r
22260 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
22270 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
22280 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62  nKey1) is a numb
22290 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a  er or a null */.
222a0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
222b0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
222c0 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20  ) ){ .    res = 
222d0 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20  pPKey2->r2;     
222e0 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
222f0 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  ) is a blob */. 
22300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
22310 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nCmp;.    int nS
22320 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64  tr;.    int szHd
22330 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20  r = aKey1[0];.. 
22340 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61     nStr = (seria
22350 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a  l_type-12) / 2;.
22360 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b      if( (szHdr +
22370 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29   nStr) > nKey1 )
22380 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e  {.      pPKey2->
22390 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
223a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
223b0 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
223c0 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74  0;    /* Corrupt
223d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
223e0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b   nCmp = MIN( pPK
223f0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20  ey2->aMem[0].n, 
22400 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20  nStr );.    res 
22410 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
22420 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e  szHdr], pPKey2->
22430 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29  aMem[0].z, nCmp)
22440 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ;..    if( res==
22450 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
22460 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e   nStr - pPKey2->
22470 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20  aMem[0].n;.     
22480 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
22490 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79         if( pPKey
224a0 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
224b0 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73           res = s
224c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
224d0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
224e0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
224f0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  Key2, 1);.      
22500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22510 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
22520 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
22530 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
22540 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  qSeen = 1;.     
22550 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
22560 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
22570 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
22580 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65  y2->r2;.      }e
22590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
225a0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
225b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
225c0 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
225d0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
225e0 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->r2;.    }else{
225f0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
22600 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20  ey2->r1;.    }. 
22610 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
22620 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
22630 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
22640 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a  1, pPKey2, res).
22650 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
22660 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70  T_DB.       || p
22670 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
22680 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
22690 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
226a0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  res;.}../*.** Re
226b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
226c0 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65  o an sqlite3Vdbe
226d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
226e0 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74  compatible funct
226f0 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ion.** suitable 
22700 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65  for comparing se
22710 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73  rialized records
22720 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64   to the unpacked
22730 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a   record passed.*
22740 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
22750 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72  gument..*/.Recor
22760 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33  dCompare sqlite3
22770 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
22780 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
22790 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52  p){.  /* varintR
227a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
227b0 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f  ) and varintReco
227c0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
227d0 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20  ) both assume.  
227e0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  ** that the size
227f0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
22800 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  t that occurs at
22810 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
22820 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66  ch record.  ** f
22830 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
22840 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32  byte (i.e. is 12
22850 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69  7 or less). vari
22860 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
22870 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61  nt().  ** also a
22880 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
22890 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65  s safe to overre
228a0 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61  ad a buffer by a
228b0 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a  t least the .  *
228c0 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62  * maximum possib
228d0 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20  le legal header 
228e0 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65  size plus 8 byte
228f0 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65  s. Because there
22900 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74   is.  ** guarant
22910 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61  eed to be at lea
22920 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31  st 74 (but not 1
22930 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64  36) bytes of pad
22940 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  ding following e
22950 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ach.  ** buffer 
22960 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74  passed to varint
22970 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
22980 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  () this makes it
22990 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20   convenient to. 
229a0 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69   ** limit the si
229b0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
229c0 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20   to 64 bytes in 
229d0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
229e0 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a  first field.  **
229f0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   is an integer..
22a00 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61    **.  ** The ea
22a10 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66  siest way to enf
22a20 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20  orce this limit 
22a30 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f  is to consider o
22a40 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68  nly records with
22a50 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20  .  ** 13 fields 
22a60 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20  or less. If the 
22a70 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61  first field is a
22a80 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d  n integer, the m
22a90 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a  aximum legal.  *
22aa0 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  * header size is
22ab0 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20   (12*5 + 1 + 1) 
22ac0 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28  bytes.  */.  if(
22ad0 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41   p->pKeyInfo->nA
22ae0 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20  llField<=13 ){. 
22af0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
22b00 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b  ->aMem[0].flags;
22b10 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79  .    if( p->pKey
22b20 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
22b30 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  [0] ){.      p->
22b40 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  r1 = 1;.      p-
22b50 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  >r2 = -1;.    }e
22b60 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  lse{.      p->r1
22b70 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
22b80 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  r2 = 1;.    }.  
22b90 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d    if( (flags & M
22ba0 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20  EM_Int) ){.     
22bb0 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
22bc0 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20  rdCompareInt;.  
22bd0 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
22be0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ( flags & MEM_Re
22bf0 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
22c00 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
22c10 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Null );.    test
22c20 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
22c30 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66  M_Blob );.    if
22c40 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  ( (flags & (MEM_
22c50 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  Real|MEM_Null|ME
22c60 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70  M_Blob))==0 && p
22c70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ->pKeyInfo->aCol
22c80 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  l[0]==0 ){.     
22c90 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
22ca0 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20   MEM_Str );.    
22cb0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
22cc0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
22cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
22ce0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
22cf0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
22d00 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
22d10 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
22d20 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
22d30 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
22d40 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
22d50 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
22d60 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
22d70 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
22d80 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
22d90 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
22da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
22db0 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
22dc0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
22dd0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
22de0 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
22df0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
22e00 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
22e10 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
22e20 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
22e30 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
22e40 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
22e50 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
22e60 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
22e70 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
22e80 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
22e90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
22ea0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
22eb0 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
22ec0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
22ed0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
22ee0 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
22ef0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
22f00 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
22f10 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
22f20 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
22f30 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
22f40 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
22f50 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
22f60 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
22f70 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
22f80 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
22f90 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
22fa0 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
22fb0 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
22fc0 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
22fd0 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
22fe0 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
22ff0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
23000 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
23010 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
23020 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
23030 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
23040 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
23050 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
23060 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
23070 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
23080 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
23090 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
230a0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
230b0 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
230c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
230d0 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
230e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  ;.  assert( (nCe
230f0 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
23100 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
23110 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
23120 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
23130 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
23140 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
23150 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
23160 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
23170 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
23180 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
23190 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
231a0 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
231b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
231c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
231d0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
231e0 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
231f0 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
23200 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
23210 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
23220 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
23230 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
23240 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23250 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
23260 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
23270 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
23280 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
23290 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
232a0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
232b0 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
232c0 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
232d0 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
232e0 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
232f0 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
23300 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
23310 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
23320 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
23330 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
23340 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
23350 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
23360 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
23370 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
23380 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
23390 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
233a0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
233b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
233c0 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
233d0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
233e0 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
233f0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
23400 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
23410 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
23420 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
23430 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
23440 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
23450 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
23460 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
23470 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
23480 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
23490 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
234a0 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
234b0 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
234c0 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20  es[typeRowid];. 
234d0 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29   testcase( (u32)
234e0 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f  m.n==szHdr+lenRo
234f0 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  wid );.  if( unl
23500 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73  ikely((u32)m.n<s
23510 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29  zHdr+lenRowid) )
23520 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
23530 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
23540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68  .  }..  /* Fetch
23550 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66   the integer off
23560 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23570 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
23580 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
23590 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a  ialGet((u8*)&m.z
235a0 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
235b0 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
235c0 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69    *rowid = v.u.i
235d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
235e0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
235f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23600 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
23610 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63  re if database c
23620 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
23630 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61  ected after m ha
23640 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f  s been.  ** allo
23650 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65  cated.  Free the
23660 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65   m object and re
23670 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23680 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69  UPT. */.idx_rowi
23690 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20  d_corruption:.  
236a0 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61  testcase( m.szMa
236b0 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c  lloc!=0 );.  sql
236c0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
236d0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
236e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
236f0 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
23700 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
23710 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
23720 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
23730 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
23740 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
23750 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e  ey string in pUn
23760 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69  packed.  Write i
23770 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
23780 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
23790 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
237a0 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
237b0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
237c0 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
237d0 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61  eater than pUnpa
237e0 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51  cked.  Return SQ
237f0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
23800 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ss..**.** pUnpac
23810 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72  ked is either cr
23820 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
23830 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
23840 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
23850 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
23860 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
23870 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
23880 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
23890 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
238a0 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
238b0 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
238c0 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
238d0 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
238e0 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
238f0 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
23900 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
23910 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f  e entire key..*/
23920 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
23930 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
23940 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
23970 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
23980 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
239a0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
239b0 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
239c0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
239d0 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
239e0 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
239f0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
23a00 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23a30 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
23a40 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
23a50 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
23a60 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
23a70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
23a80 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
23a90 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
23aa0 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
23ab0 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d   );.  pCur = pC-
23ac0 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61  >uc.pCursor;.  a
23ad0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
23ae0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
23af0 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c  (pCur) );.  nCel
23b00 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  lKey = sqlite3Bt
23b10 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
23b20 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c  Cur);.  /* nCell
23b30 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
23b40 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
23b50 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
23b60 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
23b70 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
23b80 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
23b90 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
23ba0 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
23bb0 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
23bc0 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
23bd0 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
23be0 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
23bf0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
23c00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23c10 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
23c20 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
23c30 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
23c40 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
23c50 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
23c60 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26  (u32)nCellKey, &
23c70 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
23c80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23c90 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69   }.  *res = sqli
23ca0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
23cb0 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
23cc0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
23cd0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
23ce0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
23cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23d00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23d10 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
23d20 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
23d30 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
23d40 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
23d50 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
23d60 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
23d70 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
23d80 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
23d90 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
23da0 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
23db0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
23dc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23dd0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
23de0 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
23df0 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
23e00 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
23e10 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
23e20 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
23e30 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
23e40 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
23e50 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
23e60 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
23e70 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
23e80 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
23e90 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
23ea0 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
23eb0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
23ec0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
23ed0 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
23ee0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
23ef0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
23f00 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
23f10 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
23f20 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
23f30 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
23f40 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
23f50 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
23f60 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
23f70 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
23f80 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
23f90 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
23fa0 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
23fb0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
23fc0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
23fd0 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
23fe0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
23ff0 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
24000 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
24010 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
24020 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
24030 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
24040 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
24050 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
24060 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
24070 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
24080 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
24090 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
240a0 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
240b0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
240c0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
240d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
240e0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
240f0 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
24100 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
24110 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
24120 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
24130 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
24140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24150 20 74 68 65 20 53 51 4c 49 54 45 5f 50 52 45 50   the SQLITE_PREP
24160 41 52 45 20 66 6c 61 67 73 20 66 6f 72 20 61 20  ARE flags for a 
24170 56 64 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  Vdbe..*/.u8 sqli
24180 74 65 33 56 64 62 65 50 72 65 70 61 72 65 46 6c  te3VdbePrepareFl
24190 61 67 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ags(Vdbe *v){.  
241a0 72 65 74 75 72 6e 20 76 2d 3e 70 72 65 70 46 6c  return v->prepFl
241b0 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ags;.}../*.** Re
241c0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
241d0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
241e0 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
241f0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
24200 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
24210 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
24220 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
24230 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
24240 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
24250 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
24260 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
24270 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
24280 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
24290 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
242a0 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
242b0 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
242c0 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
242d0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
242e0 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
242f0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
24300 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
24310 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
24320 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
24330 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
24340 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
24350 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
24360 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
24370 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
24380 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
24390 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
243a0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
243b0 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (v->db->flags & 
243c0 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
243d0 47 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  G)==0 );.    if(
243e0 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   0==(pMem->flags
243f0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a   & MEM_Null) ){.
24400 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
24410 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  lue *pRet = sqli
24420 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64  te3ValueNew(v->d
24430 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  b);.      if( pR
24440 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
24450 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
24460 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d  ((Mem *)pRet, pM
24470 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
24480 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66  ite3ValueApplyAf
24490 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66  finity(pRet, aff
244a0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
244b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
244c0 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
244d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
244e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
244f0 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
24500 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
24510 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
24520 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
24530 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
24540 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
24550 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
24560 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
24570 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
24580 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
24590 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
245a0 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
245b0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
245c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
245d0 72 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  r>0 );.  assert(
245e0 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26   (v->db->flags &
245f0 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
24600 53 47 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  SG)==0 );.  if( 
24610 69 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20  iVar>=32 ){.    
24620 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78  v->expmask |= 0x
24630 38 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73  80000000;.  }els
24640 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
24650 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
24660 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
24670 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 20  ../*.** Cause a 
24680 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72 6f  function to thro
24690 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74  w an error if it
246a0 20 77 61 73 20 63 61 6c 6c 20 66 72 6f 6d 20 4f   was call from O
246b0 50 5f 50 75 72 65 46 75 6e 63 0a 2a 2a 20 72 61  P_PureFunc.** ra
246c0 74 68 65 72 20 74 68 61 6e 20 4f 50 5f 46 75 6e  ther than OP_Fun
246d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f  ction..**.** OP_
246e0 50 75 72 65 46 75 6e 63 20 6d 65 61 6e 73 20 74  PureFunc means t
246f0 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
24700 20 6d 75 73 74 20 62 65 20 64 65 74 65 72 6d 69   must be determi
24710 6e 69 73 74 69 63 2c 20 61 6e 64 20 73 68 6f 75  nistic, and shou
24720 6c 64 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 65  ld.** throw an e
24730 72 72 6f 72 20 69 66 20 69 74 20 69 73 20 67 69  rror if it is gi
24740 76 65 6e 20 69 6e 70 75 74 73 20 74 68 61 74 20  ven inputs that 
24750 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 6e 6f  would make it no
24760 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e  n-deterministic.
24770 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24780 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 64   is invoked by d
24790 61 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f  ate/time functio
247a0 6e 73 20 74 68 61 74 20 75 73 65 20 6e 6f 6e 2d  ns that use non-
247b0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0a 2a 2a  deterministic.**
247c0 20 66 65 61 74 75 72 65 73 20 73 75 63 68 20 61   features such a
247d0 73 20 27 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20  s 'now'..*/.int 
247e0 73 71 6c 69 74 65 33 4e 6f 74 50 75 72 65 46 75  sqlite3NotPureFu
247f0 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
24800 78 74 20 2a 70 43 74 78 29 7b 0a 23 69 66 64 65  xt *pCtx){.#ifde
24810 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
24820 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
24830 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65   if( pCtx->pVdbe
24840 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
24850 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 43 74  #endif.  if( pCt
24860 78 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43  x->pVdbe->aOp[pC
24870 74 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d  tx->iOp].opcode=
24880 3d 4f 50 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a  =OP_PureFunc ){.
24890 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
248a0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
248b0 20 20 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74 65         "non-dete
248c0 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69  rministic functi
248d0 6f 6e 20 69 6e 20 69 6e 64 65 78 20 65 78 70 72  on in index expr
248e0 65 73 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b 20  ession or CHECK 
248f0 63 6f 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20 20  constraint",.   
24900 20 20 20 20 2d 31 29 3b 0a 20 20 20 20 72 65 74      -1);.    ret
24910 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
24920 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 1;.}..#ifnde
24930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
24940 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
24950 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20   Transfer error 
24960 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f  message text fro
24970 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  m an sqlite3_vta
24980 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  b.zErrMsg (text 
24990 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
249a0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
249b0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
249c0 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45  ) into a Vdbe.zE
249d0 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
249e0 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
249f0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
24a00 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a  lite3DbMalloc)..
24a10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
24a20 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
24a30 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  Vdbe *p, sqlite3
24a40 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
24a50 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72   if( pVtab->zErr
24a60 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
24a70 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
24a80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24a90 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
24aa0 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
24ab0 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
24ac0 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
24ad0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
24ae0 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
24af0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
24b00 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
24b10 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  0;.  }.}.#endif 
24b20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
24b30 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
24b40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
24b50 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
24b60 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  OOK../*.** If th
24b70 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24b80 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72  t is not NULL, r
24b90 65 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63  elease any alloc
24ba0 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ations associate
24bb0 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d  d .** with the m
24bc0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74  emory cells in t
24bd0 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72  he p->aMem[] arr
24be0 61 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68  ay. Also free th
24bf0 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e UnpackedRecord
24c00 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74  .** structure it
24c10 73 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69  self, using sqli
24c20 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a  te3DbFree()..**.
24c30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24c40 20 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65   is used to free
24c50 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
24c60 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63  structures alloc
24c70 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76  ated by.** the v
24c80 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28  dbeUnpackRecord(
24c90 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64  ) function found
24ca0 20 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a   in vdbeapi.c..*
24cb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
24cc0 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73  beFreeUnpacked(s
24cd0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
24ce0 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64  nField, Unpacked
24cf0 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66  Record *p){.  if
24d00 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
24d10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
24d20 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  <nField; i++){. 
24d30 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
24d40 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20   &p->aMem[i];.  
24d50 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
24d60 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56  alloc ) sqlite3V
24d70 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
24d80 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  em);.    }.    s
24d90 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
24da0 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  b, p);.  }.}.#en
24db0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
24dc0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
24dd0 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  OOK */..#ifdef S
24de0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
24df0 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a  UPDATE_HOOK./*.*
24e00 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65  * Invoke the pre
24e10 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66  -update hook. If
24e20 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
24e30 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65  TE or DELETE pre
24e40 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a  -update call,.**
24e50 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73   then cursor pas
24e60 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
24e70 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  d argument shoul
24e80 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  d point to the r
24e90 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62  ow about.** to b
24ea0 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  e update or dele
24eb0 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c  ted. If the appl
24ec0 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71  ication calls sq
24ed0 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
24ee0 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65  old(),.** the re
24ef0 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c  quired value wil
24f00 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
24f10 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
24f20 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a  r points to..*/.
24f30 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
24f40 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20  PreUpdateHook(. 
24f50 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
24f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f70 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64   /* Vdbe pre-upd
24f80 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f  ate hook is invo
24f90 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65  ked by */.  Vdbe
24fa0 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
24fc0 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c  ursor to grab ol
24fd0 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  d.* values from 
24fe0 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
25010 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
25020 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e   DELETE */.  con
25030 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25050 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f  Database name */
25060 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25080 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74     /* Modified t
25090 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b  able */.  i64 iK
250a0 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey1,            
250b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
250c0 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a  tial key value *
250d0 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20  /.  int iReg    
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
25100 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64  for new.* record
25110 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
25120 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20   *db = v->db;.  
25130 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65  i64 iKey2;.  Pre
25140 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65  Update preupdate
25150 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
25160 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTbl = pTab->zNa
25170 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  me;.  static con
25180 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72  st u8 fakeSortOr
25190 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  der = 0;..  asse
251a0 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61  rt( db->pPreUpda
251b0 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  te==0 );.  memse
251c0 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c  t(&preupdate, 0,
251d0 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74   sizeof(PreUpdat
251e0 65 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f  e));.  if( HasRo
251f0 77 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a  wid(pTab)==0 ){.
25200 20 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79      iKey1 = iKey
25210 32 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70  2 = 0;.    preup
25220 64 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74  date.pPk = sqlit
25230 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
25240 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  x(pTab);.  }else
25250 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51  {.    if( op==SQ
25260 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20  LITE_UPDATE ){. 
25270 20 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e       iKey2 = v->
25280 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a  aMem[iReg].u.i;.
25290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
252a0 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a   iKey2 = iKey1;.
252b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
252c0 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c  ert( pCsr->nFiel
252d0 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20  d==pTab->nCol . 
252e0 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e        || (pCsr->
252f0 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
25300 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49  ol+1 && op==SQLI
25310 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65  TE_DELETE && iRe
25320 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70  g==-1).  );..  p
25330 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a  reupdate.v = v;.
25340 20 20 70 72 65 75 70 64 61 74 65 2e 70 43 73 72    preupdate.pCsr
25350 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70   = pCsr;.  preup
25360 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  date.op = op;.  
25370 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65  preupdate.iNewRe
25380 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75  g = iReg;.  preu
25390 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62  pdate.keyinfo.db
253a0 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61   = db;.  preupda
253b0 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d  te.keyinfo.enc =
253c0 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75   ENC(db);.  preu
253d0 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b  pdate.keyinfo.nK
253e0 65 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e  eyField = pTab->
253f0 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74  nCol;.  preupdat
25400 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f  e.keyinfo.aSortO
25410 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b  rder = (u8*)&fak
25420 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72  eSortOrder;.  pr
25430 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20  eupdate.iKey1 = 
25440 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61  iKey1;.  preupda
25450 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32  te.iKey2 = iKey2
25460 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54  ;.  preupdate.pT
25470 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62  ab = pTab;..  db
25480 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26  ->pPreUpdate = &
25490 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d  preupdate;.  db-
254a0 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
254b0 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61  ack(db->pPreUpda
254c0 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a  teArg, db, op, z
254d0 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c  Db, zTbl, iKey1,
254e0 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70   iKey2);.  db->p
254f0 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  PreUpdate = 0;. 
25500 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25510 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65  b, preupdate.aRe
25520 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65  cord);.  vdbeFre
25530 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72  eUnpacked(db, pr
25540 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
25550 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65  nKeyField+1, pre
25560 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64  update.pUnpacked
25570 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
25580 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
25590 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79  ate.keyinfo.nKey
255a0 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61  Field+1, preupda
255b0 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29  te.pNewUnpacked)
255c0 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74  ;.  if( preupdat
255d0 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e  e.aNew ){.    in
255e0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
255f0 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64  ; i<pCsr->nField
25600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
25610 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
25620 61 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61  ase(&preupdate.a
25630 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  New[i]);.    }. 
25640 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25650 4e 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  NN(db, preupdate
25660 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .aNew);.  }.}.#e
25670 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
25680 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
25690 48 4f 4f 4b 20 2a 2f 0a                          HOOK */.