/ Hex Artifact Content
Login

Artifact e9aa37f7bc19415218bc9d5a83f3fa86fb3c504ecb0d67d159f6d138df5b837a:


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 2f 2a 0a 2a 2a 20  type);.}../*.** 
22c0: 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53  Add an OP_ParseS
22d0: 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54  chema opcode.  T
22e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62  his routine is b
22f0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a  roken out from.*
2300: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
2310: 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e  Op4() since it n
2320: 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65  eeds to also nee
2330: 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62  ds to mark all b
2340: 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69  trees.** as havi
2350: 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a  ng been used..**
2360: 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73  .** The zWhere s
2370: 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20  tring must have 
2380: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
2390: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
23a0: 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  c()..** This rou
23b0: 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f  tine will take o
23c0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
23d0: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
23e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23f0: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
2400: 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  emaOp(Vdbe *p, i
2410: 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57  nt iDb, char *zW
2420: 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a  here){.  int j;.
2430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2440: 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op4(p, OP_ParseS
2450: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
2460: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
2470: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
2480: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
2490: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
24a0: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
24b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
24c0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
24d0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
24e0: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
24f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2500: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
2510: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
2520: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
2530: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
2540: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
2550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2560: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
2570: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
2580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
2590: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
25a0: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
25b0: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
25c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25e0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
25f0: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
2600: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
2610: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
2620: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
2630: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
2640: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
2650: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
2660: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
2670: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
2680: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
2690: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
26a0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
26b0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20   = P4_INT32;.   
26c0: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b   pOp->p4.i = p4;
26d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
26e0: 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74  dr;.}../* Insert
26f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f   the end of a co
2700: 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64  -routine.*/.void
2710: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2720: 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76  oroutine(Vdbe *v
2730: 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b  , int regYield){
2740: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2750: 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
2760: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
2770: 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20  d);..  /* Clear 
2780: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  the temporary re
2790: 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68  gister cache, th
27a0: 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74  ereby ensuring t
27b0: 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f  hat each.  ** co
27c0: 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73  -routine has its
27d0: 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74   own independent
27e0: 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72   set of register
27f0: 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f  s, because co-ro
2800: 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68  utines.  ** migh
2810: 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72  t expect their r
2820: 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70  egisters to be p
2830: 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20  reserved across 
2840: 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64  an OP_Yield, and
2850: 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64  .  ** that could
2860: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20   cause problems 
2870: 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
2880: 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  o-routines are u
2890: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
28a0: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ** temporary reg
28b0: 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d  ister..  */.  v-
28c0: 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  >pParse->nTempRe
28d0: 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72  g = 0;.  v->pPar
28e0: 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
28f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2900: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
2910: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
2920: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
2930: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
2940: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
2950: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
2960: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
2970: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
2980: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
2990: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
29a0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
29b0: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
29c0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
29d0: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
29e0: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
29f0: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
2a00: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
2a10: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
2a20: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
2a30: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
2a40: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
2a50: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
2a60: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
2a70: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
2a80: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
2a90: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
2aa0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
2ab0: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
2ac0: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
2ad0: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
2ae0: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
2af0: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
2b00: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
2b10: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
2b20: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
2b30: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
2b40: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
2b50: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
2b60: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
2b70: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
2b80: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  akeLabel(Vdbe *v
2b90: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  ){.  Parse *p = 
2ba0: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  v->pParse;.  int
2bb0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
2bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d  ;.  assert( v->m
2bd0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2be0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28  _INIT );.  if( (
2bf0: 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b  i & (i-1))==0 ){
2c00: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  .    p->aLabel =
2c10: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
2c20: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
2c30: 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20  ->aLabel, .     
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66    (i*2+1)*sizeof
2c70: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b  (p->aLabel[0]));
2c80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c  .  }.  if( p->aL
2c90: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
2ca0: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20  Label[i] = -1;. 
2cb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52   }.  return ADDR
2cc0: 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (i);.}../*.** Re
2cd0: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
2ce0: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
2cf0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2d00: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
2d10: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
2d20: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
2d30: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
2d40: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2d50: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
2d60: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2d70: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
2d80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2d90: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
2da0: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
2db0: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2dc0: 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28  .  int j = ADDR(
2dd0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  x);.  assert( v-
2de0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2df0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
2e00: 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  ert( j<p->nLabel
2e10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
2e20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
2e30: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
2e40: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
2e50: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
2e60: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
2e70: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
2e80: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
2e90: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
2ea0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
2eb0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
2ec0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
2ed0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
2ee0: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
2ef0: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
2f00: 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20  be run multiple 
2f10: 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  times..*/.void s
2f20: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
2f30: 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  le(Vdbe *p){.  p
2f40: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
2f50: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
2f60: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
2f70: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
2f80: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
2f90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2fa0: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
2fb0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
2fc0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2fd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
2fe0: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
2ff0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
3000: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
3010: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
3020: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
3030: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
3040: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
3050: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
3060: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
3070: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
3080: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
3090: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
30a0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
30b0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
30c0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
30f0: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
3100: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3110: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3120: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
3130: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
3140: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
3150: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3160: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
3170: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
3180: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
3190: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
31a0: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
31b0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
31c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31d0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
31e0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
31f0: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
3200: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
3210: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
3220: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
3230: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
3240: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
3250: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3260: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
3270: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
3280: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3290: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
32a0: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
32b0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
32c0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e0: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
32f0: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
3300: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
3310: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
3320: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
3330: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
3340: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
3350: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
3360: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
3370: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
3380: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
3390: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
33a0: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
33b0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
33c0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
33d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
33e0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
33f0: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
3400: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
3410: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
3420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3430: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
3440: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
3450: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
3460: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
3470: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
3480: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
3490: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
34a0: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
34b0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
34c0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
34d0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
34e0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
34f0: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
3500: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
3510: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
3520: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3530: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
3540: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
3550: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
3560: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
3570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3580: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
3590: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
35a0: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
35b0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
35c0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
35d0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
35e0: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
35f0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
3600: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
3610: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
3620: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
3630: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
3640: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
3650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3660: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
3670: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
3680: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
3690: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
36a0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
36b0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
36c0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
36d0: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
36e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
36f0: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
3700: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
3710: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
3720: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
3730: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
3740: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
3750: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
3760: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
3770: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
3780: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
3790: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
37a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
37b0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
37c0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
37d0: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
37e0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
37f0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
3800: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
3810: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
3820: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
3830: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
3840: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
3850: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
3860: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
3870: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20  constraint).**  
3880: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72   *  OP_CreateBtr
3890: 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  ee/BTREE_INTKEY 
38a0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
38b0: 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66  tine .**      (f
38c0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
38d0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
38e0: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
38f0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
3900: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3910: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3920: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3930: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3940: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3950: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3960: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3970: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3980: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3990: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
39a0: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
39b0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
39c0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
39d0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
39e0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
39f0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
3a00: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3a10: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3a20: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3a30: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3a40: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3a50: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3a60: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3a70: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3a80: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3a90: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3aa0: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
3ab0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
3ac0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
3ad0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
3ae0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
3af0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3b00: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3b10: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3b20: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3b30: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3b40: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3b50: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3b60: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3b70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3b80: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3b90: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3ba0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
3bb0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
3bc0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
3bd0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
3be0: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
3bf0: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
3c00: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3c10: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
3c20: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
3c30: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
3c40: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
3c50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
3c60: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42  code==OP_CreateB
3c70: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d  tree && pOp->p3=
3c80: 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20  =BTREE_INTKEY ) 
3c90: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
3ca0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
3cb0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
3cc0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
3cd0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
3ce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3cf0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3d10: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
3d20: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
3d30: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
3d40: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
3d50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3d60: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
3d70: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
3d80: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
3d90: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
3da0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
3db0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
3dc0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
3dd0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
3de0: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
3df0: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
3e00: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
3e10: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
3e20: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3e30: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3e40: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3e50: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3e60: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3e70: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3e80: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3e90: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3ea0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
3eb0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
3ec0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
3ed0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
3ee0: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
3ef0: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3f10: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
3f20: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
3f30: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
3f40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3f50: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3f60: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3f70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3f80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3f90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
3fa0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
3fb0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
3fc0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
3fd0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
3fe0: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
3ff0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
4000: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
4010: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
4020: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
4030: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
4040: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
4050: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
4060: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
4070: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
4080: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
4090: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
40a0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
40b0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
40c0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
40d0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
40e0: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
40f0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
4100: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
4110: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
4120: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
4130: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
4140: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
4150: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
4160: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
4170: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
4180: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
4190: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
41a0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
41b0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
41c0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
41d0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
41e0: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
41f0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
4200: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
4210: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
4220: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
4230: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
4240: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
4250: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
4260: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
4270: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
4280: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
4290: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
42a0: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
42b0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
42c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
42d0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
42e0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
42f0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
4300: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
4310: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
4320: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
4330: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
4340: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
4350: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
4360: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
4370: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
4380: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
4390: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
43a0: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
43b0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
43c0: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
43d0: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
43e0: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
43f0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
4400: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
4410: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
4420: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
4430: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
4440: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
4450: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
4460: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
4470: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
4480: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
4490: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
44a0: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
44b0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
44c0: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
44d0: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
44e0: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
44f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
4500: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
4510: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
4520: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
4530: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
4540: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
4550: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
4560: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
4570: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
4580: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
4590: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
45a0: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
45b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
45c0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
45d0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
45e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
45f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4600: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
4610: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
4620: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
4630: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
4640: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
4650: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
4660: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
4670: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
4680: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
4690: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
46a0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
46b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
46c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
46d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
46e0: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
46f0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
4700: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
4710: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
4720: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4730: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
4740: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
4750: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
4760: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
4770: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
4780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4790: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
47a0: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
47b0: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f   case OP_NextIfO
47c0: 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 63 61 73  pen:.        cas
47d0: 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
47e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
47f0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
4800: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
4810: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
4820: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
4830: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ANCE;.          
4840: 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
4850: 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65  rator never code
4860: 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f  s any of these o
4870: 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70  pcodes as a jump
4880: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
4890: 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20   a label.  They 
48a0: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64  are always coded
48b0: 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77   as a jump backw
48c0: 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20  ards to a .     
48d0: 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64       ** known ad
48e0: 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20  dress */.       
48f0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
4900: 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  p2>=0 );.       
4910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4920: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
4930: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
4940: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
4950: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
4960: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
4970: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
4980: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20  ePrevious;.     
4990: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
49a0: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
49b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49c0: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e  code generator n
49d0: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f  ever codes any o
49e0: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  f these opcodes 
49f0: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20  as a jump.      
4a00: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65      ** to a labe
4a10: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77  l.  They are alw
4a20: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a  ays coded as a j
4a30: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f  ump backwards to
4a40: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   a .          **
4a50: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a   known address *
4a60: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
4a70: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
4a80: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4a90: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
4aa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4ab0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
4ac0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55        case OP_VU
4ad0: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
4ae0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
4af0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
4b00: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
4b10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4b20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b30: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
4b40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
4b50: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  t n;.          a
4b60: 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d  ssert( (pOp - p-
4b70: 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20  >aOp) >= 3 );.  
4b80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4b90: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
4ba0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
4bb0: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b          n = pOp[
4bc0: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20  -1].p1;.        
4bd0: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
4be0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61  .          /* Fa
4c00: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
4c10: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65  the default case
4c20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23 65   */.        }.#e
4c30: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66  ndif.        def
4c40: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
4c50: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20    if( pOp->p2<0 
4c60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
4c70: 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  * The mkopcodeh.
4c80: 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73  tcl script has s
4c90: 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67  o arranged thing
4ca0: 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a  s that the only.
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
4cc0: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20  on-jump opcodes 
4cd0: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45  less than SQLITE
4ce0: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72  _MX_JUMP_CODE ar
4cf0: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  e guaranteed to.
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68              ** h
4d10: 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  ave non-negative
4d20: 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20   values for P2. 
4d30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
4d40: 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f  ssert( (sqlite3O
4d50: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4d60: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
4d70: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20  LG_JUMP)!=0 );. 
4d80: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
4d90: 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29  t( ADDR(pOp->p2)
4da0: 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20  <pParse->nLabel 
4db0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
4dc0: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
4dd0: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a  ADDR(pOp->p2)];.
4de0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4df0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4e10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70       /* The mkop
4e20: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74  codeh.tcl script
4e30: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64   has so arranged
4e40: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65   things that the
4e50: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e   only.      ** n
4e60: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20  on-jump opcodes 
4e70: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45  less than SQLITE
4e80: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72  _MX_JUMP_CODE ar
4e90: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  e guaranteed to.
4ea0: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f        ** have no
4eb0: 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  n-negative value
4ec0: 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20  s for P2. */.   
4ed0: 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69     assert( (sqli
4ee0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
4ef0: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f  y[pOp->opcode]&O
4f00: 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c  PFLG_JUMP)==0 ||
4f10: 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20   pOp->p2>=0);.  
4f20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d    }.    if( pOp=
4f30: 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b  =p->aOp ) break;
4f40: 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a  .    pOp--;.  }.
4f50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4f60: 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  p->db, pParse->a
4f70: 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65  Label);.  pParse
4f80: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  ->aLabel = 0;.  
4f90: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d  pParse->nLabel =
4fa0: 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41   0;.  *pMaxFuncA
4fb0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
4fc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
4fd0: 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d  Reader!=0 || DbM
4fe0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
4ff0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f  reeMask) );.}../
5000: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5010: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
5020: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
5030: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
5040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
5050: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
5060: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
5070: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5080: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5090: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
50a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  }../*.** Verify 
50b0: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20  that at least N 
50c0: 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65  opcode slots are
50d0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20   available in p 
50e0: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
50f0: 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20  g to malloc for 
5100: 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65  more space (exce
5110: 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  pt when compiled
5120: 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
5130: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
5140: 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74  RESS).  This int
5150: 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64  erface is used d
5160: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a  uring testing.**
5170: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
5180: 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f  certain calls to
5190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
51a0: 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65  pList() can neve
51b0: 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f  r.** fail due to
51c0: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64   a OOM fault and
51d0: 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20   hence that the 
51e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
51f0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
5200: 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c  AddOpList() will
5210: 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e   always be non-N
5220: 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ULL..*/.#if defi
5230: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
5240: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
5250: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
5260: 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73  C_STRESS).void s
5270: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
5280: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
5290: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29  (Vdbe *p, int N)
52a0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
52b0: 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61  Op + N <= p->pPa
52c0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b  rse->nOpAlloc );
52d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
52e0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
52f0: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68   VM passed as th
5300: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
5310: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5320: 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74  .** an OP_Result
5330: 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c  Row opcode. Fail
5340: 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20   an assert() if 
5350: 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73  it does. This is
5360: 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65   used.** by code
5370: 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20   in pragma.c to 
5380: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
5390: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
53a0: 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61  f certain.** pra
53b0: 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69  gmas comports wi
53c0: 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65  th the flags spe
53d0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b  cified in the mk
53e0: 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a  pragmatab.tcl.**
53f0: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20   script..*/.#if 
5400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5410: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
5420: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
5430: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
5440: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
5450: 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28  rifyNoResultRow(
5460: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
5470: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5480: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
5490: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
54a0: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52  [i].opcode!=OP_R
54b0: 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a  esultRow );.  }.
54c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
54d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
54e0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
54f0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
5500: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
5510: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
5520: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
5530: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5540: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
5550: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
5560: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
5570: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
5580: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
5590: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
55a0: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
55b0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
55c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
55d0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
55e0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
55f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
5600: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
5610: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
5620: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
5630: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
5640: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
5650: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
5660: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
5670: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
5680: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
5690: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
56a0: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
56b0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
56c0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
56d0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
56e0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
56f0: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
5700: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
5710: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
5720: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
5730: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
5740: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
5750: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
5760: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
5770: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
5780: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
5790: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
57a0: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
57b0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
57c0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
57d0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
57e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
57f0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
5800: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
5810: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
5820: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
5830: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
5840: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  ack.  Return a.*
5850: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
5860: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
5870: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
5880: 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67   Non-zero P2 arg
5890: 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69  uments to jump i
58a0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
58b0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64  automatically ad
58c0: 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61  justed.** so tha
58d0: 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65  t the jump targe
58e0: 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f  t is relative to
58f0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
5900: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
5910: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
5920: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a  3VdbeAddOpList(.
5930: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5950: 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f  * Add opcodes to
5960: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
5970: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
5980: 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   nOp,           
5990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
59a0: 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74  ber of opcodes t
59b0: 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f  o add */.  VdbeO
59c0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
59d0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
59e0: 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64  pcodes to be add
59f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  ed */.  int iLin
5a00: 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  eno             
5a10: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66       /* Source-f
5a20: 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ile line number 
5a30: 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20  of first opcode 
5a40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
5a50: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a   VdbeOp *pOut, *
5a60: 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74  pFirst;.  assert
5a70: 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ( nOp>0 );.  ass
5a80: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
5a90: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
5aa0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
5ab0: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
5ac0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
5ad0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
5ae0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
5af0: 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74 20  0;.  }.  pFirst 
5b00: 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70  = pOut = &p->aOp
5b10: 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28  [p->nOp];.  for(
5b20: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
5b30: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b   aOp++, pOut++){
5b40: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64  .    pOut->opcod
5b50: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = aOp->opcode;
5b60: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20  .    pOut->p1 = 
5b70: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75  aOp->p1;.    pOu
5b80: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b  t->p2 = aOp->p2;
5b90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70  .    assert( aOp
5ba0: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 69  ->p2>=0 );.    i
5bb0: 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  f( (sqlite3Opcod
5bc0: 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e 6f  eProperty[aOp->o
5bd0: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a  pcode] & OPFLG_J
5be0: 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d 3e  UMP)!=0 && aOp->
5bf0: 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 4f  p2>0 ){.      pO
5c00: 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70  ut->p2 += p->nOp
5c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  ;.    }.    pOut
5c20: 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a  ->p3 = aOp->p3;.
5c30: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
5c40: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
5c50: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
5c60: 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20  0;.    pOut->p5 
5c70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
5c80: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5c90: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70  N_COMMENTS.    p
5ca0: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  Out->zComment = 
5cb0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
5cc0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
5cd0: 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e  ERAGE.    pOut->
5ce0: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
5cf0: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
5d00: 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23  (void)iLineno;.#
5d10: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
5d20: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
5d30: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
5d40: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
5d50: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
5d60: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5d70: 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20  Op(0, i+p->nOp, 
5d80: 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70  &p->aOp[i+p->nOp
5d90: 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ]);.    }.#endif
5da0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d  .  }.  p->nOp +=
5db0: 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70   nOp;.  return p
5dc0: 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65  First;.}..#if de
5dd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
5de0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
5df0: 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  TUS)./*.** Add a
5e00: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 61  n entry to the a
5e10: 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72 73  rray of counters
5e20: 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c 69   managed by sqli
5e30: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
5e40: 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tus()..*/.void s
5e50: 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53 74  qlite3VdbeScanSt
5e60: 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70 2c  atus(.  Vdbe *p,
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f          /* VM to
5e90: 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28   add scanstatus(
5ea0: 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ) to */.  int ad
5eb0: 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20  drExplain,      
5ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
5ed0: 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61  ress of OP_Expla
5ee0: 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69  in (or 0) */.  i
5ef0: 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20  nt addrLoop,    
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f10: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f  * Address of loo
5f20: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20  p counter */ .  
5f30: 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20 20  int addrVisit,  
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 6f  /* Address of ro
5f60: 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e 74  ws visited count
5f70: 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  er */.  LogEst n
5f80: 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Est,            
5f90: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
5fa0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
5fb0: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20  utput rows */.  
5fc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5fd0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
5fe0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
5ff0: 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20   or index being 
6000: 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20  scanned */.){.  
6010: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
6020: 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f  nScan+1) * sizeo
6030: 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20  f(ScanStatus);. 
6040: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65   ScanStatus *aNe
6050: 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61  w;.  aNew = (Sca
6060: 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33  nStatus*)sqlite3
6070: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
6080: 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65   p->aScan, nByte
6090: 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b  );.  if( aNew ){
60a0: 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75 73 20  .    ScanStatus 
60b0: 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d  *pNew = &aNew[p-
60c0: 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70  >nScan++];.    p
60d0: 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  New->addrExplain
60e0: 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a   = addrExplain;.
60f0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f      pNew->addrLo
6100: 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20  op = addrLoop;. 
6110: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73     pNew->addrVis
6120: 69 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a  it = addrVisit;.
6130: 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d      pNew->nEst =
6140: 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d   nEst;.    pNew-
6150: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
6160: 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20  DbStrDup(p->db, 
6170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61  zName);.    p->a
6180: 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  Scan = aNew;.  }
6190: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
61a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
61b0: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
61c0: 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c  , or P1, P2, P3,
61d0: 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a   or P5 operands.
61e0: 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  ** for a specifi
61f0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
6200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6210: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56  beChangeOpcode(V
6220: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
6230: 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29  , u8 iNewOpcode)
6240: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
6250: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70  etOp(p,addr)->op
6260: 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64  code = iNewOpcod
6270: 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  e;.}.void sqlite
6280: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
6290: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
62a0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
62b0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
62c0: 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b  addr)->p1 = val;
62d0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
62e0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
62f0: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
6300: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
6310: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
6320: 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d  dr)->p2 = val;.}
6330: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6340: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
6350: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
6360: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
6370: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
6380: 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p3 = val;.}.v
6390: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
63a0: 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c  hangeP5(Vdbe *p,
63b0: 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73 73 65   u16 p5){.  asse
63c0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
63d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
63e0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
63f0: 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70 5b 70  nOp>0 ) p->aOp[p
6400: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35  ->nOp-1].p5 = p5
6410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
6420: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
6430: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
6440: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
6450: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
6460: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
6470: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
6480: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
6490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
64a0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
64b0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
64c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
64d0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
64e0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
64f0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
6500: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
6510: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
6520: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
6530: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
6540: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
6550: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
6560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6570: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
6580: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
6590: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
65a0: 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66  {.  if( (pDef->f
65b0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
65c0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
65d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
65e0: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44 65 66  bFreeNN(db, pDef
65f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
6600: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
6610: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
6620: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
6630: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
6640: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
6650: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ry..*/.static SQ
6660: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
6670: 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73 71 6c  id freeP4Mem(sql
6680: 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70  ite3 *db, Mem *p
6690: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61  ){.  if( p->szMa
66a0: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
66b0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
66c0: 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  loc);.  sqlite3D
66d0: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
66e0: 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  }.static SQLITE_
66f0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
6700: 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c 69  eeP4FuncCtx(sqli
6710: 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33  te3 *db, sqlite3
6720: 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20  _context *p){.  
6730: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
6740: 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75  ction(db, p->pFu
6750: 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44 62 46  nc);. sqlite3DbF
6760: 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  reeNN(db, p);.}.
6770: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
6780: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
6790: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
67a0: 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28   *p4){.  assert(
67b0: 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28   db );.  switch(
67c0: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63   p4type ){.    c
67d0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
67e0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 46 75  {.      freeP4Fu
67f0: 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74  ncCtx(db, (sqlit
6800: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b  e3_context*)p4);
6810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6820: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6830: 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50  REAL:.    case P
6840: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73  4_INT64:.    cas
6850: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
6860: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6870: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6880: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
6890: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
68a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
68b0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
68c0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
68d0: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
68e0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
68f0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
6900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6910: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
6920: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
6930: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
6940: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
6950: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6960: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
6970: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6980: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
6990: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
69a0: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
69b0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
69c0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
69d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
69e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
69f0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
6a00: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
6a10: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
6a20: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
6a30: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
6a40: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
6a50: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
6a60: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
6a70: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
6a80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6a90: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
6aa0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
6ab0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
6ac0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
6ad0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
6ae0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
6af0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
6b00: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
6b10: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
6b20: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
6b30: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
6b40: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
6b50: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
6b60: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
6b70: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
6b80: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
6b90: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
6ba0: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
6bb0: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
6bc0: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
6bd0: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
6be0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
6bf0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
6c00: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
6c10: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
6c20: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
6c30: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
6c40: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
6c50: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
6c60: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
6c70: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
6c80: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
6c90: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
6ca0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6cb0: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
6cc0: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
6cd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6ce0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
6cf0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
6d00: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
6d10: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
6d20: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6d30: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
6d40: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
6d50: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
6d60: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
6d70: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
6d80: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
6d90: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
6da0: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
6db0: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
6dc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6dd0: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
6de0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
6df0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
6e00: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
6e10: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
6e20: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
6e30: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
6e40: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
6e50: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
6e60: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
6e70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
6e80: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
6e90: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
6ea0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
6eb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6ec0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
6ed0: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
6ee0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
6ef0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
6f00: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
6f10: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
6f20: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
6f30: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
6f40: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
6f50: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
6f60: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6f70: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
6f80: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
6f90: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
6fa0: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
6fb0: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
6fc0: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
6fd0: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
6fe0: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
6ff0: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
7000: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
7010: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7020: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
7030: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
7040: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
7050: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
7060: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
7070: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
7080: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7090: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
70a0: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
70b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
70c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
70d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
70e0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
70f0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
7100: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
7110: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
7120: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
7130: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
7140: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
7150: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
7160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
7170: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
7180: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
7190: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
71a0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
71b0: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
71c0: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
71d0: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
71e0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
71f0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
7200: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
7210: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
7220: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
7230: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
7240: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
7250: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
7260: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
7270: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
7280: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
7290: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
72a0: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
72b0: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
72c0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
72d0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
72e0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
72f0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
7300: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
7310: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
7320: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
7330: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
7340: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
7350: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
7360: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
7370: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
7380: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
7390: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
73a0: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
73b0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
73c0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
73d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
73e0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
73f0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
7400: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
7410: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
7420: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
7430: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
7440: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
7450: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
7460: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
7470: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
7480: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
7490: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
74a0: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
74b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
74c0: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
74d0: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
74e0: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
74f0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
7500: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7510: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
7520: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
7530: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
7540: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
7550: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
7560: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
7570: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7580: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
7590: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
75a0: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
75b0: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
75c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
75d0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
75e0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
75f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
7600: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
7610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7620: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
7630: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7640: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7650: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
7660: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
7670: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
7680: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
7690: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
76a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
76b0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
76c0: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
76d0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
76e0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
76f0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
7700: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
7710: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
7720: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
7730: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
7740: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
7750: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
7760: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
7770: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
7780: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
7790: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
77a0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
77b0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
77c0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
77d0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
77e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
77f0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
7800: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
7810: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
7820: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
7830: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
7840: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
7850: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
7860: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
7870: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
7880: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
7890: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
78a0: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
78b0: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
78c0: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
78d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
78e0: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
78f0: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
7900: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
7910: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
7920: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
7930: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
7940: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
7950: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
7960: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
7970: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
7980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
7990: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
79a0: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
79b0: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
79c0: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
79d0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
79e0: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
79f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
7a00: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
7a10: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
7a20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7a30: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
7a40: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
7a50: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
7a60: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
7a70: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
7a80: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
7a90: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
7aa0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
7ab0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
7ac0: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
7ad0: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
7ae0: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
7af0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
7b00: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
7b10: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
7b20: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
7b30: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
7b40: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
7b50: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7b60: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
7b70: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
7b80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7b90: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
7ba0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
7bb0: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
7bc0: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
7bd0: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
7be0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
7bf0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
7c00: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
7c10: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
7c20: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
7c30: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
7c40: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
7c50: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
7c60: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
7c70: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
7c80: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
7c90: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
7ca0: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
7cb0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
7cc0: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
7cd0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
7ce0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
7cf0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
7d00: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
7d10: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
7d20: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
7d30: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
7d40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
7d50: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
7d60: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
7d70: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
7d80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
7d90: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
7da0: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
7db0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
7dc0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
7dd0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
7de0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
7df0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
7e00: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
7e10: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
7e20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
7e30: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
7e40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
7e50: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
7e60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
7e70: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
7e80: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
7e90: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
7ea0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7eb0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
7ec0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
7ed0: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
7ee0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
7ef0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
7f00: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
7f10: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
7f20: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
7f30: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
7f40: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
7f50: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
7f60: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
7f70: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
7f80: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
7f90: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7fa0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
7fb0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
7fc0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
7fd0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
7fe0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
7ff0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
8000: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
8010: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
8020: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
8030: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
8040: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
8050: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
8060: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
8070: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
8080: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8090: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
80a0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
80b0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
80c0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
80d0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
80e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
80f0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
8100: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
8110: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
8120: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
8130: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
8140: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
8150: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8160: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
8170: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
8180: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
8190: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
81a0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
81b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
81c0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
81d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
81e0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
81f0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
8200: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
8210: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
8220: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
8230: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
8240: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
8250: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
8260: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
8270: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
8280: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
8290: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
82a0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
82b0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
82c0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
82d0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
82e0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
82f0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
8300: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
8310: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
8320: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
8330: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
8340: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
8350: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
8360: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
8370: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
8380: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
8390: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
83a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
83b0: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
83c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
83d0: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
83e0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
83f0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
8400: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
8410: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
8420: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
8430: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
8440: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
8450: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
8460: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
8470: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
8480: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
8490: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
84a0: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
84b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
84c0: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
84d0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
84e0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
84f0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
8500: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
8510: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
8520: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
8530: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
8540: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
8550: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
8560: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
8570: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
8580: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8590: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
85a0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
85b0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
85c0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
85d0: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
85e0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
85f0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
8600: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8610: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8620: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
8630: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
8640: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
8650: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
8660: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
8670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8680: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8690: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
86a0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
86b0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
86c0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
86d0: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
86e0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
86f0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
8700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
8710: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
8720: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
8730: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
8740: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
8750: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
8760: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
8770: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
8780: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
8790: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
87a0: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
87b0: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
87c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
87d0: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
87e0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
87f0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
8800: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
8810: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
8820: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
8830: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
8840: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
8850: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
8860: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
8870: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
8880: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
8890: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
88a0: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
88b0: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
88c0: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
88d0: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
88e0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
88f0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
8900: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
8910: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
8920: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
8930: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
8940: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
8950: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
8960: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
8970: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
8980: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
8990: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
89a0: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
89b0: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
89c0: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
89d0: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
89e0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
89f0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
8a00: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
8a10: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
8a20: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
8a30: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
8a40: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
8a50: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
8a60: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
8a70: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
8a80: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
8a90: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
8aa0: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
8ab0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
8ac0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
8ad0: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
8ae0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
8af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
8b00: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
8b10: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
8b20: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
8b30: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
8b40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
8b50: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8b60: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
8b70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8b80: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
8b90: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
8ba0: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
8bb0: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
8bc0: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
8bd0: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
8be0: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
8bf0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
8c00: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
8c10: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
8c20: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
8c30: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
8c40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8c50: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
8c60: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
8c70: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
8c80: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
8c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8ca0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8cb0: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
8cc0: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
8cd0: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
8ce0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8cf0: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
8d00: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
8d10: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
8d20: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
8d30: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
8d40: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
8d50: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
8d60: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
8d70: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
8d80: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
8d90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8da0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
8db0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
8dc0: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
8dd0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
8de0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
8df0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8e00: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
8e10: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
8e20: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
8e30: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
8e40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8e50: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
8e60: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
8e70: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
8e80: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
8e90: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8ea0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8eb0: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
8ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8ed0: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
8ee0: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
8ef0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8f00: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
8f10: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
8f20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8f30: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
8f40: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
8f50: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
8f60: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
8f70: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
8f80: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
8f90: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
8fb0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
8fc0: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
8fd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8fe0: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
8ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9000: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9010: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9020: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
9030: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
9040: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
9050: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
9060: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
9070: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
9080: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
9090: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
90a0: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
90b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
90c0: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
90d0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
90e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
90f0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
9100: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
9110: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
9120: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
9130: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
9140: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
9150: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9160: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
9170: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
9180: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
9190: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
91a0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
91b0: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
91c0: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
91d0: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
91e0: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
91f0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
9200: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9210: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
9220: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
9230: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
9240: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
9250: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9260: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
9270: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
9280: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
9290: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
92a0: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
92b0: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
92c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
92d0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
92e0: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
92f0: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
9300: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
9310: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
9320: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
9330: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
9340: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
9350: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
9360: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
9370: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
9380: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
9390: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
93a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
93b0: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
93c0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
93d0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
93e0: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
93f0: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 51 22 2c  XPrintf(p, "%Q",
9400: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
9410: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9420: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
9430: 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  GER:.      sqlit
9440: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 64  e3XPrintf(p, "%d
9450: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  ", pExpr->u.iVal
9460: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
9470: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
9480: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL:.      sqlite
9490: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c  3XPrintf(p, "NUL
94a0: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
94b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
94c0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
94d0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
94e0: 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72  , "r[%d]", pExpr
94f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
9500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9510: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9520: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
9530: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
9540: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9550: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 6f 77  3XPrintf(p, "row
9560: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
9570: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9580: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 63 25  e3XPrintf(p, "c%
9590: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
95a0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
95b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
95c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
95d0: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
95e0: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
95f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
9600: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
9610: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9620: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
9630: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
9640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9650: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
9660: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
9670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9680: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
9690: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
96a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
96b0: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
96c0: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
96d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
96e0: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
96f0: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
9700: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
9710: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
9720: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
9730: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
9740: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
9750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9760: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
9770: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
9780: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9790: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
97a0: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
97b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
97c0: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
97d0: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
97e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
97f0: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
9800: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9810: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
9820: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
9830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9840: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
9850: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
9860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9870: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
9880: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
9890: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
98a0: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
98b0: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
98c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
98d0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
98e0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
98f0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
9900: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
9910: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
9920: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
9930: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
9940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9950: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
9960: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
9970: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9980: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
9990: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
99a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
99b0: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
99c0: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
99d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
99e0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
99f0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9a00: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
9a10: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
9a20: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
9a30: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
9a40: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
9a50: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
9a60: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
9a70: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73  e3XPrintf(p, "%s
9a80: 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20  ", "expr");.    
9a90: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
9aa0: 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73  if( zOp ){.    s
9ab0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9ac0: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
9ad0: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28    displayP4Expr(
9ae0: 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  p, pExpr->pLeft)
9af0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
9b00: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
9b10: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
9b20: 41 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31  Append(p, ",", 1
9b30: 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  );.      display
9b40: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
9b50: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
9b60: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9b70: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 29 22  cumAppend(p, ")"
9b80: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 1);.  }.}.#end
9b90: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
9ba0: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
9bb0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9bc0: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a  URSOR_HINTS) */.
9bd0: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
9be0: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  AY_P4./*.** Comp
9bf0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
9c00: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
9c10: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
9c20: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
9c30: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
9c40: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
9c50: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
9c60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
9c70: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
9c80: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
9c90: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
9ca0: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
9cb0: 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b  p;.  StrAccum x;
9cc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
9cd0: 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  >=20 );.  sqlite
9ce0: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
9cf0: 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d  , 0, zTemp, nTem
9d00: 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  p, 0);.  switch(
9d10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
9d20: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
9d30: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
9d40: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
9d50: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
9d60: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
9d70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
9d80: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
9d90: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  er!=0 );.      s
9da0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9db0: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
9dc0: 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a  fo->nKeyField);.
9dd0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9de0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  <pKeyInfo->nKeyF
9df0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
9e00: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9e10: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
9e20: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
9e30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
9e40: 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f  ll = pColl ? pCo
9e50: 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a  ll->zName : "";.
9e60: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
9e70: 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52  mp(zColl, "BINAR
9e80: 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d  Y")==0 ) zColl =
9e90: 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71   "B";.        sq
9ea0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9eb0: 20 22 2c 25 73 25 73 22 2c 20 70 4b 65 79 49 6e   ",%s%s", pKeyIn
9ec0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
9ed0: 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43  ] ? "-" : "", zC
9ee0: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oll);.      }.  
9ef0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9f00: 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 29  cumAppend(&x, ")
9f10: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
9f20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
9f30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
9f40: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
9f50: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
9f60: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
9f70: 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e  xpr(&x, pOp->p4.
9f80: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  pExpr);.      br
9f90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
9fa0: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  f.    case P4_CO
9fb0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
9fc0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9fd0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
9fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9ff0: 6e 74 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29  ntf(&x, "(%.20s)
a000: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
a010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a020: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
a030: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
a040: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
a050: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
a060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
a070: 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64  rintf(&x, "%s(%d
a080: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
a090: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
a0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a0b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a0c0: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
a0d0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
a0e0: 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50 34 5f  LE).    case P4_
a0f0: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
a100: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
a110: 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70   pOp->p4.pCtx->p
a120: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
a130: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
a140: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
a150: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
a160: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a170: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a180: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
a190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
a1a0: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64  Printf(&x, "%lld
a1b0: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
a1c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a1d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
a1e0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
a1f0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
a200: 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  &x, "%d", pOp->p
a210: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
a220: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a230: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
a240: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
a250: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a  f(&x, "%.16g", *
a260: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
a270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a280: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
a290: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
a2a0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
a2b0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
a2c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
a2d0: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
a2e0: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
a2f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a300: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
a310: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
a320: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
a330: 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  &x, "%lld", pMem
a340: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
a350: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
a360: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
a370: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a380: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e  3XPrintf(&x, "%.
a390: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29  16g", pMem->u.r)
a3a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
a3b0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
a3c0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
a3d0: 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22      zP4 = "NULL"
a3e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a3f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a400: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
a410: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
a420: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
a430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a440: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
a450: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a460: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
a470: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
a480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
a490: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
a4a0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
a4b0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
a4c0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76 74 61  XPrintf(&x, "vta
a4d0: 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20  b:%p", pVtab);. 
a4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a4f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
a500: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
a510: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a520: 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f      int *ai = pO
a530: 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20  p->p4.ai;.      
a540: 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20  int n = ai[0];  
a550: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c   /* The first el
a560: 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41  ement of an INTA
a570: 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20 74  RRAY is always t
a580: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
a590: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75            ** cou
a5a0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
a5b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20   of elements to 
a5c0: 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  follow */.      
a5d0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69  for(i=1; i<=n; i
a5e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
a5f0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
a600: 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20  ",%d", ai[i]);. 
a610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
a620: 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20  mp[0] = '[';.   
a630: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
a640: 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d 22  umAppend(&x, "]"
a650: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
a660: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a670: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
a680: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
a690: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72 6f  XPrintf(&x, "pro
a6a0: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
a6b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a6c0: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
a6d0: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
a6e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
a6f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a700: 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20  e P4_TABLE: {.  
a710: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
a720: 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70  tf(&x, "%s", pOp
a730: 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  ->p4.pTab->zName
a740: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a750: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
a760: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
a770: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
a780: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
a790: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
a7a0: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
a7b0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
a7c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
a7d0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
a7e0: 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65  nish(&x);.  asse
a7f0: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
a800: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
a810: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
a820: 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a  PLAY_P4 */../*.*
a830: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
a840: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
a850: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
a860: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
a870: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
a880: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
a890: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
a8a0: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
a8b0: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
a8c0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
a8d0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
a8e0: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
a8f0: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
a900: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
a910: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
a920: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
a930: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
a940: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
a950: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
a960: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
a970: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
a980: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a990: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
a9a0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
a9b0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
a9c0: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
a9d0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
a9e0: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
a9f0: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
aa00: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
aa10: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
aa20: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
aa30: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
aa40: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
aa50: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
aa60: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
aa70: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
aa80: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
aa90: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
aaa0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
aab0: 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a  ARED_CACHE)./*.*
aac0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
aad0: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
aae0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
aaf0: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
ab00: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
ab10: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
ab20: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
ab30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
ab40: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
ab50: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
ab60: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
ab70: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
ab80: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
ab90: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
aba0: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
abb0: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
abc0: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
abd0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
abe0: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
abf0: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
ac00: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
ac10: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
ac20: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
ac30: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
ac40: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
ac50: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
ac60: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
ac70: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
ac80: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
ac90: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
aca0: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
acb0: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
acc0: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
acd0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
ace0: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
acf0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
ad00: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
ad10: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
ad20: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
ad30: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
ad40: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
ad50: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
ad60: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
ad70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
ad80: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
ad90: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
ada0: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
adb0: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
adc0: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
add0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
ade0: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
adf0: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
ae00: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
ae10: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
ae20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
ae30: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
ae40: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
ae50: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
ae60: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
ae70: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
ae80: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
ae90: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
aea0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
aeb0: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
aec0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
aed0: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
aee0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
aef0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
af00: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
af10: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
af20: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
af30: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
af40: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
af50: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
af60: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
af70: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
af80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
af90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
afa0: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
afb0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
afc0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
afd0: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
afe0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
aff0: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29  nter(aDb[i].pBt)
b000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
b010: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
b020: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b030: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
b040: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
b050: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  E>0./*.** Unlock
b060: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65   all of the btre
b070: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  es previously lo
b080: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  cked by a call t
b090: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  o sqlite3VdbeEnt
b0a0: 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er()..*/.static 
b0b0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
b0c0: 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56  void vdbeLeave(V
b0d0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
b0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
b0f0: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
b100: 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d  t nDb;.  db = p-
b110: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
b120: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
b130: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
b140: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
b150: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
b160: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
b170: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
b180: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
b190: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b1a0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
b1b0: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
b1c0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
b1d0: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
b1e0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61   *p){.  if( DbMa
b1f0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
b200: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
b210: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
b220: 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65  case */.  vdbeLe
b230: 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  ave(p);.}.#endif
b240: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
b250: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
b260: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
b270: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
b280: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
b290: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
b2a0: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
b2b0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
b2c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
b2d0: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
b2e0: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
b2f0: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
b300: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
b310: 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31  ];.  char zCom[1
b320: 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  00];.  static co
b330: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
b340: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
b350: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33  %4d %4d %4d %-13
b360: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
b370: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
b380: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
b390: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
b3a0: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
b3b0: 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20  (zPtr));.#ifdef 
b3c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
b3d0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
b3e0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
b3f0: 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20  pOp, zP4, zCom, 
b400: 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23  sizeof(zCom));.#
b410: 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d  else.  zCom[0] =
b420: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   0;.#endif.  /* 
b430: 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33  NB:  The sqlite3
b440: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e  OpcodeName() fun
b450: 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
b460: 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65  nted by code cre
b470: 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  ated.  ** by the
b480: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61   mkopcodeh.awk a
b490: 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b  nd mkopcodec.awk
b4a0: 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65   scripts which e
b4b0: 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20  xtract the.  ** 
b4c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
b4d0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
b4e0: 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72  ce text */.  fpr
b4f0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
b500: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
b510: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
b520: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
b530: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
b540: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
b550: 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a  pOp->p5,.      z
b560: 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73  Com.  );.  fflus
b570: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
b580: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
b590: 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ize an array of 
b5a0: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a  N Mem element..*
b5b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
b5c0: 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  itMemArray(Mem *
b5d0: 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65  p, int N, sqlite
b5e0: 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67 73  3 *db, u16 flags
b5f0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d  ){.  while( (N--
b600: 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62  )>0 ){.    p->db
b610: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c   = db;.    p->fl
b620: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
b630: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
b640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b650: 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53 63  DEBUG.    p->pSc
b660: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e  opyFrom = 0;.#en
b670: 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d  dif.    p++;.  }
b680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
b690: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
b6a0: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
b6b0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b6c0: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
b6d0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
b6e0: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
b6f0: 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e  Mem *pEnd = &p[N
b700: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
b710: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
b720: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
b730: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f  reed ){.      do
b740: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
b750: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
b760: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
b770: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
b780: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
b790: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  End );.      ret
b7a0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
b7b0: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
b7c0: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
b7d0: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
b7e0: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db );.      asse
b7f0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
b800: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
b810: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  s(p) );..      /
b820: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
b830: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
b840: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
b850: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
b860: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
b870: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
b880: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
b890: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
b8a0: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
b8b0: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
b8c0: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
b8d0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
b8e0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
b8f0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
b900: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
b910: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
b920: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
b930: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
b940: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
b950: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
b960: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
b970: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
b980: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
b990: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
b9a0: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
b9b0: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
b9c0: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
b9d0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
b9e0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
b9f0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
ba00: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
ba10: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
ba20: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
ba30: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
ba40: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
ba50: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
ba60: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
ba70: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
ba80: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
ba90: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
baa0: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
bab0: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
bac0: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
bad0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
bae0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
baf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bb00: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
bb10: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Agg );.      tes
bb20: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
bb30: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20  & MEM_Dyn );.   
bb40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
bb50: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d  flags & MEM_Fram
bb60: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
bb70: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
bb80: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20  MEM_RowSet );.  
bb90: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
bba0: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
bbb0: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
bbc0: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
bbd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
bbe0: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
bbf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
bc00: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
bc10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
bc20: 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  eNN(db, p->zMall
bc30: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
bc40: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
bc50: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
bc60: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
bc70: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c  fined;.    }whil
bc80: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
bc90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
bca0: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65  lete a VdbeFrame
bcb0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20   object and its 
bcc0: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72  contents. VdbeFr
bcd0: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a  ame objects are.
bce0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
bcf0: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
bd00: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33  pcode in sqlite3
bd10: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76  VdbeExec()..*/.v
bd20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
bd30: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46  rameDelete(VdbeF
bd40: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rame *p){.  int 
bd50: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  i;.  Mem *aMem =
bd60: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29   VdbeFrameMem(p)
bd70: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
bd80: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  *apCsr = (VdbeCu
bd90: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
bda0: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66  >nChildMem];.  f
bdb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
bdc0: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
bdd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
bde0: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
bdf0: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
be00: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
be10: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
be20: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  m);.  sqlite3Vdb
be30: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
be40: 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75  ->v->db, &p->pAu
be50: 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
be60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
be70: 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ->v->db, p);.}..
be80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
be90: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
bea0: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
beb0: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
bec0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
bed0: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
bee0: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
bef0: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
bf00: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
bf10: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
bf20: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
bf30: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
bf40: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
bf50: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
bf60: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
bf70: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
bf80: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
bf90: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  AIN"..**.** When
bfa0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
bfb0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
bfc0: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65   is listed.  Whe
bfd0: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  n.** p->explain=
bfe0: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c  =2, only OP_Expl
bff0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ain instructions
c000: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20   are listed and 
c010: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f  these.** are sho
c020: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  wn in a differen
c030: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78  t format.  p->ex
c040: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64  plain==2 is used
c050: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
c060: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c070: 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  LAN..**.** When 
c080: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66  p->explain==1, f
c090: 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72  irst the main pr
c0a0: 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c  ogram is listed,
c0b0: 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a   then each of.**
c0c0: 20 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62   the trigger sub
c0d0: 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73  programs are lis
c0e0: 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ted one by one..
c0f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c100: 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  beList(.  Vdbe *
c110: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
c120: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
c130: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77  */.){.  int nRow
c140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c160: 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f  Stop when row co
c170: 75 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73  unt reaches this
c180: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d   */.  int nSub =
c190: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c1b0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65  mber of sub-vdbe
c1c0: 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  s seen so far */
c1d0: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
c1e0: 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  apSub = 0;      
c1f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
c200: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f   of sub-vdbes */
c210: 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30  .  Mem *pSub = 0
c220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c230: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
c240: 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61  y cell hold arra
c250: 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f  y of subprogs */
c260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c270: 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20   p->db;         
c280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
c290: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c2a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  on */.  int i;  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c2d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
c2e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c2f0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
c300: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
c310: 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a   code */.  Mem *
c320: 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
c330: 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
c340: 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20  /* First Mem of 
c350: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
c360: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
c370: 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ain );.  assert(
c380: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
c390: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61  MAGIC_RUN );.  a
c3a0: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
c3b0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
c3c0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
c3d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
c3e0: 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  OMEM );..  /* Ev
c3f0: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
c400: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75  pcode does not u
c410: 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  se dynamic strin
c420: 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  gs for.  ** the 
c430: 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63  result, result c
c440: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d  olumns may becom
c450: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65  e dynamic if the
c460: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a   user calls.  **
c470: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c480: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e  text16(), causin
c490: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  g a translation 
c4a0: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  to UTF-16 encodi
c4b0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61  ng..  */.  relea
c4c0: 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c  seMemArray(pMem,
c4d0: 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c   8);.  p->pResul
c4e0: 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  tSet = 0;..  if(
c4f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
c500: 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20  OMEM_BKPT ){.   
c510: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
c520: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
c530: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
c540: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
c550: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
c560: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
c570: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
c580: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
c590: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
c5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
c5b0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
c5c0: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
c5d0: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72  of output rows r
c5e0: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61  eaches nRow, tha
c5f0: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a  t means the.  **
c600: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e   listing has fin
c610: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65  ished and sqlite
c620: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20  3_step() should 
c630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
c640: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73  NE..  ** nRow is
c650: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c660: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
c670: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  n the main progr
c680: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68  am, plus.  ** th
c690: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
c6a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61  ber of rows in a
c6b0: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ll trigger subpr
c6c0: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72  ograms encounter
c6d0: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20  ed.  ** so far. 
c6e0: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
c6f0: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73  will increase as
c700: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62   new trigger sub
c710: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a  programs are.  *
c720: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62  * encountered, b
c730: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76  ut p->pc will ev
c740: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75  entually catch u
c750: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a  p to nRow..  */.
c760: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b    nRow = p->nOp;
c770: 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69  .  if( p->explai
c780: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==1 ){.    /* T
c790: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72  he first 8 memor
c7a0: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64  y cells are used
c7b0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
c7c0: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c  set.  So we will
c7d0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65  .    ** commande
c7e0: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20  er the 9th cell 
c7f0: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67  to use as storag
c800: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f  e for an array o
c810: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a  f pointers.    *
c820: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62  * to trigger sub
c830: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56  programs.  The V
c840: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65  DBE is guarantee
c850: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61  d to have at lea
c860: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  st 9.    ** cell
c870: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
c880: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a  t( p->nMem>9 );.
c890: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61      pSub = &p->a
c8a0: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20  Mem[9];.    if( 
c8b0: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pSub->flags&MEM_
c8c0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Blob ){.      /*
c8d0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   On the first ca
c8e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ll to sqlite3_st
c8f0: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20  ep(), pSub will 
c900: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74  hold a NULL.  It
c910: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69   is.      ** ini
c920: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c  tialized to a BL
c930: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42  OB by the P4_SUB
c940: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69  PROGRAM processi
c950: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a  ng logic below *
c960: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70  /.      nSub = p
c970: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64  Sub->n/sizeof(Vd
c980: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75  be*);.      apSu
c990: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
c9a0: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
c9b0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
c9c0: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSub; i++){.   
c9d0: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62     nRow += apSub
c9e0: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  [i]->nOp;.    }.
c9f0: 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69    }..  do{.    i
ca00: 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77   = p->pc++;.  }w
ca10: 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20  hile( i<nRow && 
ca20: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
ca30: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
ca40: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
ca50: 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29  .  if( i>=nRow )
ca60: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
ca70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
ca80: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
ca90: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75   }else if( db->u
caa0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
cab0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
cac0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
cad0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
cae0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
caf0: 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
cb00: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
cb10: 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >rc));.  }else{.
cb20: 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20      char *zP4;. 
cb30: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
cb40: 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a  if( i<p->nOp ){.
cb50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74        /* The out
cb60: 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  put line number 
cb70: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
cb80: 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c  that we are stil
cb90: 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  l in the.      *
cba0: 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20  * main program. 
cbb0: 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26  */.      pOp = &
cbc0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  p->aOp[i];.    }
cbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
cbe0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
cbf0: 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72  listing subprogr
cc00: 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74  ams.  Figure out
cc10: 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20   which one and. 
cc20: 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20       ** pick up 
cc30: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
cc40: 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  opcode. */.     
cc50: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20   int j;.      i 
cc60: 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  -= p->nOp;.     
cc70: 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53   for(j=0; i>=apS
cc80: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29  ub[j]->nOp; j++)
cc90: 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61  {.        i -= a
cca0: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[j]->nOp;.  
ccb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20      }.      pOp 
ccc0: 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70  = &apSub[j]->aOp
ccd0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [i];.    }.    i
cce0: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
ccf0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
cd00: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
cd10: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
cd20: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
cd50: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
cd60: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
cd70: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
cd80: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
cd90: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
cda0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
cdb0: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
cdc0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
cdd0: 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  e); /* Opcode */
cde0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cdf0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
ce00: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
ce10: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
ce20: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
ce30: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
ce40: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
ce50: 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  ++;..      /* Wh
ce60: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
ce70: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
ce80: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
ce90: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
cea0: 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42       ** a P4_SUB
ceb0: 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74  PROGRAM argument
cec0: 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69  ), expand the si
ced0: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
cee0: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20  of subprograms. 
cef0: 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20       ** kept in 
cf00: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20  p->aMem[9].z to 
cf10: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f  hold the new pro
cf20: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20  gram - assuming 
cf30: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a  this subprogram.
cf40: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74        ** has not
cf50: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
cf60: 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  en..      */.   
cf70: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
cf80: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
cf90: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
cfa0: 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31   nByte = (nSub+1
cfb0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
cfc0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69  ram*);.        i
cfd0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
cfe0: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a  r(j=0; j<nSub; j
cff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
d000: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70  f( apSub[j]==pOp
d010: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
d020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
d030: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
d040: 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f  nSub && SQLITE_O
d050: 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65  K==sqlite3VdbeMe
d060: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
d070: 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20  e, nSub!=0) ){. 
d080: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d           apSub =
d090: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
d0a0: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20  pSub->z;.       
d0b0: 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d     apSub[nSub++]
d0c0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
d0d0: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ram;.          p
d0e0: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Sub->flags |= ME
d0f0: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  M_Blob;.        
d100: 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62    pSub->n = nSub
d110: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
d120: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  am*);.        }.
d130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
d140: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
d150: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
d160: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
d170: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
d180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d190: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  1 */.    pMem++;
d1a0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
d1b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
d1c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
d1d0: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1f0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
d200: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
d210: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
d220: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
d230: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70    /* P3 */.    p
d260: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
d270: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
d280: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
d290: 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34  m, 100) ){ /* P4
d2a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
d2b0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
d2c0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
d2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
d2e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  OR;.    }.    pM
d2f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
d300: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
d310: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
d320: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  4(pOp, pMem->z, 
d330: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b  pMem->szMalloc);
d340: 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d  .    if( zP4!=pM
d350: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70  em->z ){.      p
d360: 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20  Mem->n = 0;.    
d370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
d380: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34  SetStr(pMem, zP4
d390: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
d3a0: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  8, 0);.    }else
d3b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d3c0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
d3d0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
d3e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
d3f0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
d400: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
d410: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
d420: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
d430: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
d440: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
d450: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
d460: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
d470: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  4) ){.        as
d480: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
d490: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
d4a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d4b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
d4c0: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
d4d0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
d4e0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
d4f0: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20  em->n = 2;.     
d500: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d510: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
d520: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
d530: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
d540: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
d550: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
d560: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65  pMem++;.  .#ifde
d570: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d580: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
d590: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
d5a0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
d5b0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30  dResize(pMem, 50
d5c0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  0) ){.        as
d5d0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
d5e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
d5f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d600: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
d610: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
d620: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
d630: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
d640: 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43  em->n = displayC
d650: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
d660: 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a   pMem->z, 500);.
d670: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
d680: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
d690: 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d  else.      pMem-
d6a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
d6b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
d6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
d6d0: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ent */.#endif.  
d6e0: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
d6f0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
d700: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
d710: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
d720: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
d730: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
d740: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
d750: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
d760: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
d770: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d780: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
d790: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d7a0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
d7b0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
d7c0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
d7d0: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
d7e0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
d7f0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
d800: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  dbe *p){.  const
d810: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
d820: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
d830: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a     z = p->zSql;.
d840: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
d850: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  Op>=1 ){.    con
d860: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  st VdbeOp *pOp =
d870: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20   &p->aOp[0];.   
d880: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
d890: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
d8a0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
d8b0: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a     z = pOp->p4.z
d8c0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
d8d0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
d8e0: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) z++;.    }. 
d8f0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69   }.  if( z ) pri
d900: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
d910: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ", z);.}.#endif.
d920: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d930: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
d940: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
d950: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
d960: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
d970: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
d980: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
d990: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
d9a0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
d9b0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
d9c0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
d9d0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
d9e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
d9f0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
da00: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
da10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
da20: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
da30: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
da40: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
da50: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
da60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
da70: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
da80: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
da90: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
daa0: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
dab0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
dac0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
dad0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
dae0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
daf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
db00: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
db10: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
db20: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
db30: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
db40: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
db50: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
db60: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
db70: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
db80: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
db90: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
dba0: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
dbb0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
dbc0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
dbd0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
dbe0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
dbf0: 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  E */../* An inst
dc00: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
dc10: 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75  ect describes bu
dc20: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
dc30: 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62  ble for use.** b
dc40: 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20  y subcomponents 
dc50: 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74  of a prepared st
dc60: 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20  atement.  Space 
dc70: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74  is allocated out
dc80: 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c  .** of a Reusabl
dc90: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79  eSpace object by
dca0: 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28   the allocSpace(
dcb0: 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e  ) routine below.
dcc0: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61  .*/.struct Reusa
dcd0: 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20  bleSpace {.  u8 
dce0: 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
dcf0: 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d    /* Available m
dd00: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
dd10: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
dd20: 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 69  /* Bytes of avai
dd30: 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  lable memory */.
dd40: 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20    int nNeeded;  
dd50: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
dd60: 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64  bytes that could
dd70: 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
dd80: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20  d */.};../* Try 
dd90: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74  to allocate nByt
dda0: 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74  e bytes of 8-byt
ddb0: 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d  e aligned bulk m
ddc0: 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a  emory for pBuf.*
ddd0: 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61  * from the Reusa
dde0: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e  bleSpace object.
ddf0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
de00: 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
de10: 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e  ted.** memory on
de20: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e   success.  If in
de30: 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72  sufficient memor
de40: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  y is available i
de50: 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c  n the.** Reusabl
de60: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69  eSpace object, i
de70: 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73  ncrease the Reus
de80: 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65  ableSpace.nNeede
de90: 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68  d.** value by th
dea0: 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20  e amount needed 
deb0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
dec0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69  .**.** If pBuf i
ded0: 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20  s not initially 
dee0: 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73  NULL, that means
def0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
df00: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
df10: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  been allocated b
df20: 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  y a prior call t
df30: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  o this routine, 
df40: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  so just return a
df50: 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66   copy.** of pBuf
df60: 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61   and leave Reusa
df70: 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67  bleSpace unchang
df80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61  ed..**.** This a
df90: 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c  llocator is empl
dfa0: 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73  oyed to repurpos
dfb0: 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61  e unused slots a
dfc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
dfd0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79  .** opcode array
dfe0: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61   of prepared sta
dff0: 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d  te for other mem
e000: 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65  ory needs of the
e010: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
e020: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  tement..*/.stati
e030: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
e040: 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75  ce(.  struct Reu
e050: 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20  sableSpace *p,  
e060: 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61  /* Bulk memory a
e070: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
e080: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
e090: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
e0a0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
e0b0: 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c  r to a prior all
e0c0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ocation */.  int
e0d0: 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
e0e0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e0f0: 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
e100: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
e110: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
e120: 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29  NMENT(p->pSpace)
e130: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d   );.  if( pBuf==
e140: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
e150: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
e160: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d      if( nByte <=
e170: 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20   p->nFree ){.   
e180: 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e     p->nFree -= n
e190: 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66  Byte;.      pBuf
e1a0: 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d   = &p->pSpace[p-
e1b0: 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c  >nFree];.    }el
e1c0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65  se{.      p->nNe
e1d0: 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  eded += nByte;. 
e1e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
e1f0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
e200: 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b  IGNMENT(pBuf) );
e210: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
e220: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
e230: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
e240: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
e250: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
e260: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
e270: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e280: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
e290: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
e2a0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
e2b0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
e2c0: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
e2d0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
e2e0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
e2f0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
e300: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c  BE_MAGIC_INIT ||
e310: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
e320: 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a  MAGIC_RESET );..
e330: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
e340: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
e350: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
e360: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
e370: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
e380: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
e390: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
e3a0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
e3b0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
e3c0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
e3d0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
e3e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
e3f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
e400: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
e410: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
e420: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
e430: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
e440: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
e450: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
e460: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
e470: 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  ort;.  p->nChang
e480: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
e490: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
e4a0: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
e4b0: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
e4c0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
e4d0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
e4e0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
e4f0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28  E_PROFILE.  for(
e500: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
e510: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  ++){.    p->aOp[
e520: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
e530: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
e540: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
e550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
e560: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
e570: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
e580: 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
e590: 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72  time after.** cr
e5a0: 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75  eating the virtu
e5b0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69  al machine.  Thi
e5c0: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
e5d0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
e5e0: 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72  ocating register
e5f0: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  s and initializi
e600: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
e610: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
e620: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
e630: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
e640: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
e650: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
e660: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
e670: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
e680: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e690: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
e6a0: 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65  xactly once on e
e6b0: 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68  ach virtual mach
e6c0: 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ine..** After th
e6d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e6e0: 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20  lled the VM has 
e6f0: 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20  been "packaged" 
e700: 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20  and is ready.** 
e710: 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74  to run.  After t
e720: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e730: 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63  alled, further c
e740: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  alls to .** sqli
e750: 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66  te3VdbeAddOp() f
e760: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f  unctions are pro
e770: 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72  hibited.  This r
e780: 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63  outine disconnec
e790: 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66  ts.** the Vdbe f
e7a0: 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62  rom the Parse ob
e7b0: 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64  ject that helped
e7c0: 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20   generate it so 
e7d0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20  that the.** the 
e7e0: 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20  Vdbe becomes an 
e7f0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69  independent enti
e800: 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65  ty and the Parse
e810: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a   object can be.*
e820: 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  * destroyed..**.
e830: 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  ** Use the sqlit
e840: 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70  e3VdbeRewind() p
e850: 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74  rocedure to rest
e860: 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  ore a virtual ma
e870: 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f  chine back.** to
e880: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61   its initial sta
e890: 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20  te after it has 
e8a0: 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  been run..*/.voi
e8b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
e8c0: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
e8d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e8f0: 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20  VDBE */.  Parse 
e900: 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20  *pParse         
e910: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
e920: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29  ing context */.)
e930: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
e960: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
e970: 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20  .  int nVar;    
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
e9a0: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69  arameters */.  i
e9b0: 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  nt nMem;        
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9d0: 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65   Number of VM me
e9e0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a  mory registers *
e9f0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b  /.  int nCursor;
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ea20: 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64  cursors required
ea30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ea60: 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73  f arguments in s
ea70: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
ea80: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eaa0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
eab0: 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61  /.  struct Reusa
eac0: 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20  bleSpace x;     
ead0: 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62     /* Reusable b
eae0: 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20  ulk memory */.. 
eaf0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
eb00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
eb10: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
eb20: 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
eb30: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
eb40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
eb50: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  T );.  assert( p
eb60: 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65  Parse==p->pParse
eb70: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
eb80: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
eb90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
eba0: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
ebb0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
ebc0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
ebd0: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
ebe0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
ebf0: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
ec00: 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63  Arg;.  .  /* Eac
ec10: 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20  h cursor uses a 
ec20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68  memory cell.  Th
ec30: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28  e first cursor (
ec40: 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20  cursor 0) can.  
ec50: 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77  ** use aMem[0] w
ec60: 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65  hich is not othe
ec70: 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68  rwise used by th
ec80: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
ec90: 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   Allocate.  ** s
eca0: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
ecb0: 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75  of aMem[] for cu
ecc0: 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61  rsors 1 and grea
ecd0: 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c  ter..  ** See al
ece0: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
ecf0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
ed00: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  m += nCursor;.  
ed10: 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26  if( nCursor==0 &
ed20: 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b  & nMem>0 ) nMem+
ed30: 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72  +;  /* Space for
ed40: 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66   aMem[0] even if
ed50: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20   not used */..  
ed60: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
ed70: 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20  w much reusable 
ed80: 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61  memory is availa
ed90: 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ble at the end o
eda0: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64  f the.  ** opcod
edb0: 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65  e array.  This e
edc0: 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  xtra memory will
edd0: 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
ede0: 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e  for other elemen
edf0: 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ts.  ** of the p
ee00: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ee10: 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f  t..  */.  n = RO
ee20: 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a  UND8(sizeof(Op)*
ee30: 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20  p->nOp);        
ee40: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
ee50: 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  f opcode memory 
ee60: 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61  used */.  x.pSpa
ee70: 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61  ce = &((u8*)p->a
ee80: 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20  Op)[n];         
ee90: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
eea0: 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f  opcode memory */
eeb0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
eec0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
eed0: 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78  x.pSpace) );.  x
eee0: 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f  .nFree = ROUNDDO
eef0: 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70  WN8(pParse->szOp
ef00: 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20  Alloc - n);  /* 
ef10: 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  Bytes of unused 
ef20: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
ef30: 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29  rt( x.nFree>=0 )
ef40: 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
ef50: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
ef60: 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72  (&x.pSpace[x.nFr
ef70: 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ee]) );..  resol
ef80: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
ef90: 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
efa0: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
efb0: 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
efc0: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
efd0: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
efe0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
eff0: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
f000: 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
f010: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64    }.  p->expired
f020: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
f030: 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
f040: 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
f050: 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
f060: 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f  located in one o
f070: 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  r two.  ** passe
f080: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
f090: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
f0a0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65   reuse unused me
f0b0: 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a  mory at the .  *
f0c0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  * end of the opc
f0d0: 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77  ode array.  If w
f0e0: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
f0f0: 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f  satisfy all memo
f100: 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d  ry.  ** requirem
f110: 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20  ents by reusing 
f120: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
f130: 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20   tail, then the 
f140: 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73  second.  ** pass
f150: 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68   will fill in th
f160: 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e  e remainder usin
f170: 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79  g a fresh memory
f180: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
f190: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77   **.  ** This tw
f1a0: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
f1b0: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
f1c0: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
f1d0: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a  ssible from.  **
f1e0: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65   the leftover me
f1f0: 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20  mory at the end 
f200: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
f210: 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73  ray.  This can s
f220: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
f230: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
f240: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
f250: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
f260: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
f270: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e  .  do {.    x.nN
f280: 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  eeded = 0;.    p
f290: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70  ->aMem = allocSp
f2a0: 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c  ace(&x, p->aMem,
f2b0: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
f2c0: 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20  ));.    p->aVar 
f2d0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
f2e0: 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73   p->aVar, nVar*s
f2f0: 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20  izeof(Mem));.   
f300: 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
f310: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
f320: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
f330: 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e  (Mem*));.    p->
f340: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
f350: 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c  ce(&x, p->apCsr,
f360: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
f370: 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23  VdbeCursor*));.#
f380: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f390: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
f3a0: 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65  TUS.    p->anExe
f3b0: 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  c = allocSpace(&
f3c0: 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d  x, p->anExec, p-
f3d0: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29  >nOp*sizeof(i64)
f3e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
f3f0: 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29  ( x.nNeeded==0 )
f400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53   break;.    x.pS
f410: 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20  pace = p->pFree 
f420: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
f430: 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65  cRawNN(db, x.nNe
f440: 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72  eded);.    x.nFr
f450: 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a  ee = x.nNeeded;.
f460: 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d    }while( !db->m
f470: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
f480: 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50    p->pVList = pP
f490: 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20  arse->pVList;.  
f4a0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d  pParse->pVList =
f4b0: 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69    0;.  p->explai
f4c0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
f4d0: 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ain;.  if( db->m
f4e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f4f0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a     p->nVar = 0;.
f500: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
f510: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   0;.    p->nMem 
f520: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
f530: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
f540: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e  Cursor;.    p->n
f550: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61  Var = (ynVar)nVa
f560: 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72  r;.    initMemAr
f570: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61  ray(p->aVar, nVa
f580: 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  r, db, MEM_Null)
f590: 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
f5a0: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65  nMem;.    initMe
f5b0: 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20  mArray(p->aMem, 
f5c0: 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e  nMem, db, MEM_Un
f5d0: 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65  defined);.    me
f5e0: 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30  mset(p->apCsr, 0
f5f0: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
f600: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a  (VdbeCursor*));.
f610: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f620: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
f630: 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28  ATUS.    memset(
f640: 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d  p->anExec, 0, p-
f650: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29  >nOp*sizeof(i64)
f660: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
f670: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
f680: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
f690: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
f6a0: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
f6b0: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
f6c0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
f6d0: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
f6e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f6f0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
f700: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
f710: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
f720: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
f730: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
f740: 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d  ert( pCx->pBtx==
f750: 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79  0 || pCx->eCurTy
f760: 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
f770: 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  E );.  switch( p
f780: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a  Cx->eCurType ){.
f790: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
f7a0: 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20  _SORTER: {.     
f7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
f7c0: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
f7d0: 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Cx);.      break
f7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f7f0: 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20   CURTYPE_BTREE: 
f800: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d  {.      if( pCx-
f810: 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  >isEphemeral ){.
f820: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78 2d          if( pCx-
f830: 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33 42  >pBtx ) sqlite3B
f840: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
f850: 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Btx);.        /*
f860: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
f870: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
f880: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
f890: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
f8a0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63          ** the c
f8b0: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
f8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f8d0: 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e     assert( pCx->
f8e0: 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
f8f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f900: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
f910: 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72  (pCx->uc.pCursor
f920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
f940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f950: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
f960: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
f970: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
f980: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
f990: 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e  r *pVCur = pCx->
f9a0: 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20  uc.pVCur;.      
f9b0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
f9c0: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
f9d0: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d  pVCur->pVtab->pM
f9e0: 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73  odule;.      ass
f9f0: 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61  ert( pVCur->pVta
fa00: 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  b->nRef>0 );.   
fa10: 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d     pVCur->pVtab-
fa20: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70  >nRef--;.      p
fa30: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
fa40: 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65  VCur);.      bre
fa50: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
fa60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
fa70: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
fa80: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
fa90: 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rame..*/.static 
faa0: 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72  void closeCursor
fab0: 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70  sInFrame(Vdbe *p
fac0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ){.  if( p->apCs
fad0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
fae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
faf0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
fb00: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
fb10: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
fb20: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
fb30: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
fb40: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
fb50: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
fb60: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
fb70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
fb80: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
fb90: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
fba0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
fbb0: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
fbc0: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
fbd0: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
fbe0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
fbf0: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
fc00: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
fc10: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
fc20: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
fc30: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
fc40: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
fc50: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
fc60: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
fc70: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
fc80: 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72  e->v;.  closeCur
fc90: 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a  sorsInFrame(v);.
fca0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
fcb0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
fcc0: 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63  ATUS.  v->anExec
fcd0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65   = pFrame->anExe
fce0: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61  c;.#endif.  v->a
fcf0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
fd00: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
fd10: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
fd20: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
fd30: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
fd40: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
fd50: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
fd60: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
fd70: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
fd80: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
fd90: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
fda0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
fdb0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
fdc0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
fdd0: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e  ;.  v->db->nChan
fde0: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62  ge = pFrame->nDb
fdf0: 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65  Change;.  sqlite
fe00: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
fe10: 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41  ta(v->db, &v->pA
fe20: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
fe30: 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20    v->pAuxData = 
fe40: 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
fe50: 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78  ;.  pFrame->pAux
fe60: 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75  Data = 0;.  retu
fe70: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
fe80: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
fe90: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
fea0: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
feb0: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
fec0: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
fed0: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
fee0: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
fef0: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
ff00: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
ff10: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
ff20: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
ff30: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
ff40: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
ff50: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
ff60: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
ff70: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
ff80: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
ff90: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
ffa0: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
ffb0: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
ffc0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
ffd0: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66  e *pFrame;.    f
ffe0: 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
fff0: 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
10000 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
10010 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
10020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
10030 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
10040 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d  e);.    p->pFram
10050 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46  e = 0;.    p->nF
10060 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rame = 0;.  }.  
10070 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d  assert( p->nFram
10080 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43  e==0 );.  closeC
10090 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29  ursorsInFrame(p)
100a0 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
100b0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
100c0 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20  mArray(p->aMem, 
100d0 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  p->nMem);.  }.  
100e0 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72  while( p->pDelFr
100f0 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
10100 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e  rame *pDel = p->
10110 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70  pDelFrame;.    p
10120 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44  ->pDelFrame = pD
10130 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  el->pParent;.   
10140 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
10150 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  eDelete(pDel);. 
10160 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
10170 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f  any auxdata allo
10180 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20  cations made by 
10190 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20  the VM */.  if( 
101a0 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71  p->pAuxData ) sq
101b0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
101c0 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70  uxData(p->db, &p
101d0 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
101e0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0);.  assert( p-
101f0 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a  >pAuxData==0 );.
10200 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
10210 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
10220 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
10230 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
10240 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
10250 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
10260 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
10270 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
10280 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
10290 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
102a0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
102b0 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
102c0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
102d0 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
102e0 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
102f0 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
10300 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
10310 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
10320 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
10330 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
10340 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
10350 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
10360 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 73  ;..  if( p->nRes
10370 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65  Column ){.    re
10380 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
10390 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
103a0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
103b0 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  _N);.    sqlite3
103c0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
103d0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e  olName);.  }.  n
103e0 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
103f0 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
10400 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
10410 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
10420 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d  >aColName = (Mem
10430 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
10440 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
10450 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
10460 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
10470 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69   ) return;.  ini
10480 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  tMemArray(p->aCo
10490 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d 45  lName, n, db, ME
104a0 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  M_Null);.}../*.*
104b0 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
104c0 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
104d0 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
104e0 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
104f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
10500 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
10510 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
10520 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
10530 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
10540 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
10550 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
10560 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
10570 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
10580 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
10590 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
105a0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
105b0 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
105c0 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
105d0 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
105e0 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
105f0 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
10600 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
10610 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
10620 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
10630 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
10640 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
10650 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
10660 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
10670 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
10680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
106a0 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
106b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
106e0 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
106f0 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
10700 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
10730 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
10740 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
10750 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
10760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10770 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
10780 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
10790 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
107a0 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
107b0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
107c0 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
107d0 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
107e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
107f0 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
10800 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
10810 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
10820 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
10830 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
10840 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10850 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
10860 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
10870 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
10880 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
10890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
108a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
108b0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
108c0 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
108d0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
108e0 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
108f0 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
10900 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
10910 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
10920 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
10930 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
10940 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
10950 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
10960 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
10970 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
10980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
10990 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
109a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
109b0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
109c0 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
109d0 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
109e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
109f0 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
10a00 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
10a10 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
10a20 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
10a30 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
10a40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
10a50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
10a60 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
10a70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
10a80 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
10a90 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
10aa0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
10ab0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
10ac0 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
10ad0 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
10ae0 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
10af0 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
10b00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20  -transaction.   
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64  ** that are cand
10b30 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f  idates for a two
10b40 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73  -phase commit us
10b50 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20  ing a.          
10b60 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74           ** mast
10b70 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er-journal */.  
10b80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10b90 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63  OK;.  int needXc
10ba0 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64  ommit = 0;..#ifd
10bb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10bc0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
10bd0 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f   With this optio
10be0 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79  n, sqlite3VtabSy
10bf0 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  nc() is defined 
10c00 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20  to be simply .  
10c10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20  ** SQLITE_OK so 
10c20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a  p is not used. .
10c30 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
10c40 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64  RAMETER(p);.#end
10c50 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  if..  /* Before 
10c60 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
10c70 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
10c80 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
10c90 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
10ca0 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
10cb0 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
10cc0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
10cd0 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
10ce0 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
10cf0 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
10d00 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
10d10 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
10d20 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
10d30 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
10d40 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
10d50 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
10d60 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
10d70 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
10d80 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
10d90 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20  Sync(db, p);..  
10da0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
10db0 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
10dc0 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
10dd0 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
10de0 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
10df0 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
10e00 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
10e10 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
10e20 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
10e30 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
10e40 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
10e50 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
10e60 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
10e70 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
10e80 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
10e90 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
10ea0 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
10eb0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
10ec0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
10ed0 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
10ee0 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
10ef0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
10f00 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
10f10 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
10f20 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10f30 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
10f40 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
10f50 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
10f60 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
10f70 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61   or not a databa
10f80 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  se might need a 
10f90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10fa0 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20  epends upon.    
10fb0 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c    ** its journal
10fc0 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68   mode (among oth
10fd0 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69  er things).  Thi
10fe0 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69  s matrix determi
10ff0 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  nes which.      
11000 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73  ** journal modes
11010 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f   use a master jo
11020 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20  urnal and which 
11030 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  do not */.      
11040 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
11050 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a  aMJNeeded[] = {.
11060 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54          /* DELET
11070 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20  E   */  1,.     
11080 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20     /* PERSIST   
11090 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 1,.        /*
110a0 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c   OFF       */ 0,
110b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e  .        /* TRUN
110c0 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20  CATE  */ 1,.    
110d0 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20      /* MEMORY   
110e0 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f   */ 0,.        /
110f0 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30  * WAL       */ 0
11100 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
11110 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
11120 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69   /* Pager associ
11130 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f  ated with pBt */
11140 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
11150 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  it = 1;.      sq
11160 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11170 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pBt);.      pPag
11180 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
11190 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
111a0 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
111b0 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ].safety_level!=
111c0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
111d0 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20  S_OFF.       && 
111e0 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65  aMJNeeded[sqlite
111f0 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c  3PagerGetJournal
11200 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20  Mode(pPager)].  
11210 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20      ){ .        
11220 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a  assert( i!=1 );.
11230 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b          nTrans++
11240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11250 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
11260 65 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  eExclusiveLock(p
11270 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
11280 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
11290 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
112a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
112b0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
112c0 66 28 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65  f( db->bConcurre
112d0 6e 74 20 26 26 20 28 72 63 20 26 20 30 78 46 46  nt && (rc & 0xFF
112e0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  )==SQLITE_BUSY )
112f0 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 49  {.    /* An SQLI
11300 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
11310 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20  E_BUSY_SNAPSHOT 
11320 77 61 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  was encountered 
11330 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 61 74  while .    ** at
11340 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61 6b 65  tempting to take
11350 20 74 68 65 20 57 52 49 54 45 52 20 6c 6f 63 6b   the WRITER lock
11360 20 6f 6e 20 61 20 77 61 6c 20 66 69 6c 65 2e 20   on a wal file. 
11370 52 65 6c 65 61 73 65 20 74 68 65 0a 20 20 20 20  Release the.    
11380 2a 2a 20 57 52 49 54 45 52 20 6c 6f 63 6b 73 20  ** WRITER locks 
11390 6f 6e 20 61 6c 6c 20 77 61 6c 20 66 69 6c 65 73  on all wal files
113a0 20 61 6e 64 20 72 65 74 75 72 6e 20 65 61 72 6c   and return earl
113b0 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  y.  */.    for(i
113c0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
113d0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
113e0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
113f0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
11400 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
11410 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
11420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
11430 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
11440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
11450 61 67 65 72 44 72 6f 70 45 78 63 6c 75 73 69 76  agerDropExclusiv
11460 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
11470 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
11480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
11490 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
114a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
114b0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
114c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
114d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
114e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
114f0 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
11500 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
11510 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
11520 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
11530 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
11540 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
11550 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
11560 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
11570 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
11580 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
11590 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
115a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
115b0 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
115c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
115d0 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
115e0 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
115f0 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
11600 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
11610 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
11620 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
11630 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
11640 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
11650 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
11660 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
11670 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
11680 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11690 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
116a0 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
116b0 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
116c0 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
116d0 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
116e0 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
116f0 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
11700 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
11710 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
11720 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
11730 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
11740 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
11750 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
11760 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
11770 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
11780 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
11790 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
117a0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
117b0 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
117c0 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
117d0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
117e0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
117f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
11800 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11810 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11820 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
11830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
11840 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
11850 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
11860 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
11870 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
11880 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
11890 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
118a0 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
118b0 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
118c0 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
118d0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
118e0 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
118f0 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
11900 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
11910 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
11920 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
11930 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
11940 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
11950 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
11960 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
11970 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
11980 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
11990 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
119a0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
119b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
119c0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
119d0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
119e0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
119f0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
11a00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
11a10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
11a20 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
11a30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
11a40 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
11a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11a60 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
11a70 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
11a80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
11a90 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
11aa0 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
11ab0 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
11ac0 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
11ad0 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
11ae0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11af0 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
11b00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11b10 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
11b20 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
11b30 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11b40 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
11b50 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11b60 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
11b70 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61 72  ->pVfs;.    char
11b80 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
11b90 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
11ba0 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
11bb0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
11bc0 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
11bd0 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
11be0 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
11bf0 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
11c00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
11c10 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
11c20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
11c30 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
11c40 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
11c50 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
11c60 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
11c70 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
11c80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
11c90 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
11ca0 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
11cb0 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
11cc0 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
11cd0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11ce0 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
11cf0 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
11d00 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
11d10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
11d20 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
11d30 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
11d40 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
11d50 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
11d60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11d70 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
11d80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11d90 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
11da0 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
11db0 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
11dc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11dd0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11de0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
11df0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11e00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11e10 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
11e20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11e30 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
11e40 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
11e50 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
11e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11e70 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
11e80 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
11e90 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
11ea0 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
11eb0 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
11ec0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11ed0 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
11ee0 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
11ef0 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
11f20 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
11f30 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
11f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
11f50 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
11f60 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
11f70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11f80 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
11f90 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
11fa0 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
11fb0 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
11fc0 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
11fd0 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
11fe0 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
11ff0 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
12000 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
12010 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
12020 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
12030 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
12040 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
12050 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
12060 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
12070 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
12080 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
12090 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
120a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
120b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
120c0 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
120d0 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
120e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
120f0 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
12100 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
12110 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
12120 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
12130 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
12140 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
12150 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
12160 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
12170 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
12180 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
12190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
121a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
121b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
121c0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
121d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
121e0 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
121f0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
12200 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
12210 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
12220 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
12230 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
12240 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12250 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
12260 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
12270 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
12280 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
12290 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
122a0 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
122b0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
122c0 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
122d0 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
122e0 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
122f0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
12300 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
12310 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
12320 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
12330 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
12340 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
12350 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
12360 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
12370 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
12380 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
12390 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
123a0 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
123b0 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
123c0 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
123d0 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
123e0 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
123f0 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
12400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
12410 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
12420 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
12430 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
12440 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
12450 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
12460 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
12470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12480 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
12490 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
124a0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
124b0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
124c0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
124d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
124e0 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
124f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12510 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
12520 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
12530 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
12540 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12550 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
12560 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12570 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12580 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
12590 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
125a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
125b0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
125c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
125d0 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
125e0 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
125f0 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
12600 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
12610 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
12620 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69      if( 0==(sqli
12630 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
12640 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
12650 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
12660 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
12670 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
12680 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
12690 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
126a0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
126b0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
126c0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
126d0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
126e0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
126f0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
12700 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
12710 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
12720 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
12730 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
12740 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
12750 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
12760 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
12770 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
12780 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
12790 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
127a0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
127b0 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
127c0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
127d0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
127e0 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
127f0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
12800 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
12810 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
12820 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
12830 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
12840 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
12850 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
12860 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
12870 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
12880 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
12890 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
128a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
128b0 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
128c0 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
128d0 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
128e0 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
128f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
12900 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
12910 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
12920 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
12930 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
12940 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
12950 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
12960 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
12970 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
12980 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
12990 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
129a0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
129b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
129c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
129d0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
129e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
129f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
12a00 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
12a10 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
12a20 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
12a30 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
12a40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12a50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
12a60 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
12a70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
12a80 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
12a90 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
12aa0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12ab0 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
12ac0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
12ad0 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
12ae0 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
12af0 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
12b00 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
12b10 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
12b20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12b30 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
12b40 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
12b50 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
12b60 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
12b70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
12b80 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
12b90 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
12ba0 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
12bb0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
12bc0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
12bd0 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
12be0 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
12bf0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
12c00 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
12c10 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
12c20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
12c30 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12c40 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
12c50 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
12c60 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
12c70 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
12c80 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
12c90 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
12ca0 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
12cb0 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
12cc0 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
12cd0 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
12ce0 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
12cf0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
12d00 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
12d10 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
12d20 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
12d30 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
12d40 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
12d50 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
12d60 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
12d70 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
12d80 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
12d90 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12da0 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
12db0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
12dc0 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
12dd0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
12de0 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
12df0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
12e00 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
12e10 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
12e20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12e30 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
12e40 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
12e50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
12e60 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
12e70 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
12e80 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
12e90 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
12ea0 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
12eb0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
12ec0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
12ed0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12ee0 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
12ef0 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69  qlite3.nVdbeActi
12f00 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  ve count variabl
12f10 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
12f20 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
12f30 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
12f40 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
12f50 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
12f60 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
12f70 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
12f80 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
12f90 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
12fa0 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
12fb0 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
12fc0 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
12fd0 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
12fe0 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
12ff0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
13000 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
13010 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
13020 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
13030 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
13040 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
13050 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
13060 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
13070 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
13080 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  te = 0;.  int nR
13090 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ead = 0;.  p = d
130a0 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
130b0 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
130c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
130d0 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  y((sqlite3_stmt*
130e0 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  )p) ){.      cnt
130f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
13100 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
13110 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
13120 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
13130 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
13140 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
13150 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
13160 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
13170 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
13180 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
13190 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
131a0 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
131b0 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
131c0 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
131d0 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
131e0 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
131f0 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
13200 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
13210 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
13220 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
13230 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
13240 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
13250 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
13260 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
13270 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
13280 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
13290 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
132a0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
132b0 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
132c0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
132d0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
132e0 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
132f0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
13300 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
13310 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
13320 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
13330 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
13340 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
13350 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
13360 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
13370 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
13380 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
13390 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  OK..*/.static SQ
133a0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
133b0 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  t vdbeCloseState
133c0 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
133d0 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
133e0 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
133f0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
13400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
13410 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   i;.  const int 
13420 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
13430 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
13440 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
13450 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13460 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
13470 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 61  NT_RELEASE);.  a
13480 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
13490 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
134a0 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
134b0 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
134c0 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
134d0 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  nt) );..  for(i=
134e0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
134f0 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 32  +){ .    int rc2
13500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13510 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
13520 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
13530 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
13540 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
13550 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
13560 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
13570 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
13580 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
13590 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
135a0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
135b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
135c0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
135d0 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73  .        rc2 = s
135e0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
135f0 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
13600 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
13610 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
13620 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
13630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13640 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
13650 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13660 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  .  db->nStatemen
13670 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  t--;.  p->iState
13680 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ment = 0;..  if(
13690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
136a0 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  {.    if( eOp==S
136b0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
136c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
136d0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
136e0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
136f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
13700 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
13710 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13730 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
13740 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
13750 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
13760 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
13770 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
13780 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
13790 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
137a0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
137b0 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
137c0 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
137d0 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
137e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
137f0 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
13800 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
13810 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
13820 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
13830 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 69   opened.  */.  i
13840 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
13850 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
13860 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
13870 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
13880 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  fCons;.    db->n
13890 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
138a0 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d  = p->nStmtDefImm
138b0 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cons;.  }.  retu
138c0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
138d0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
138e0 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
138f0 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28 20  int eOp){.  if( 
13900 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  p->db->nStatemen
13910 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
13920 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
13930 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d   vdbeCloseStatem
13940 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20 7d  ent(p, eOp);.  }
13950 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13960 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
13970 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13980 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
13990 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
139a0 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65   by the database
139b0 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f   .** handle asso
139c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
139d0 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
139e0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
139f0 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d  t to be .** comm
13a00 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  itted. If there 
13a10 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
13a20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
13a30 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
13a40 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72  ** violations, r
13a50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13a60 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  OR. Otherwise, S
13a70 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
13a80 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
13a90 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c  standing FK viol
13aa0 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20  ations and this 
13ab0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
13ac0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
13ad0 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  R, set the resul
13ae0 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53  t of the VM to S
13af0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13b00 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61  _FOREIGNKEY.** a
13b10 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f  nd write an erro
13b20 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
13b30 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
13b40 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
13b50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13b60 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
13b70 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
13b80 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
13b90 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
13ba0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
13bb0 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
13bc0 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66  red && (db->nDef
13bd0 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44  erredCons+db->nD
13be0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e  eferredImmCons)>
13bf0 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65  0) .   || (!defe
13c00 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f  rred && p->nFkCo
13c10 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29  nstraint>0) .  )
13c20 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
13c30 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
13c40 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
13c50 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
13c60 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
13c70 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
13c80 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20  p, "FOREIGN KEY 
13c90 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
13ca0 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
13cb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13cc0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13cd0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
13ce0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13cf0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
13d00 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
13d10 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
13d20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
13d30 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
13d40 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
13d50 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
13d60 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
13d70 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
13d80 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
13d90 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
13da0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
13db0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
13dc0 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
13dd0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
13de0 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
13df0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
13e00 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
13e10 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
13e20 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
13e30 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
13e40 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
13e50 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
13e60 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
13e70 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
13e80 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
13e90 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
13ea0 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
13eb0 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
13ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
13ed0 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
13ee0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
13ef0 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
13f00 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
13f10 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
13f20 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
13f30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13f40 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
13f50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f    /* Used to sto
13f80 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74  re transient ret
13f90 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73  urn codes */.  s
13fa0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
13fb0 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  db;..  /* This f
13fc0 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
13fd0 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
13fe0 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
13ff0 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
14000 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
14010 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
14020 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
14030 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
14040 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
14050 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
14060 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
14070 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
14080 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
14090 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
140a0 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
140b0 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
140c0 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
140d0 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
140e0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
140f0 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
14100 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
14110 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
14120 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
14130 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
14140 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
14150 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
14160 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
14170 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
14180 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
14190 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
141a0 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
141b0 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
141c0 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
141d0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
141e0 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
141f0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
14200 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14210 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
14220 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14230 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
14240 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
14250 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  PT;.  }.  closeA
14260 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
14270 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
14280 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
14290 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
142a0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
142b0 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
142c0 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
142d0 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
142e0 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
142f0 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
14300 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
14310 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
14320 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
14330 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
14340 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
14350 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
14360 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
14370 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
14380 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
14390 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
143a0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
143b0 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
143c0 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
143d0 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
143e0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
143f0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
14400 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
14410 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
14420 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
14430 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
14440 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
14450 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
14460 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
14470 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
14480 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
14490 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
144a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
144b0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
144c0 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
144d0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
144e0 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
144f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
14500 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
14510 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
14520 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
14530 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
14540 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
14550 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
14560 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
14570 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
14580 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
14590 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
145a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
145b0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
145c0 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
145d0 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
145e0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
145f0 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
14600 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
14610 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
14620 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
14630 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
14640 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
14650 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
14660 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
14670 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
14680 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
14690 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
146a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
146b0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
146c0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
146d0 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
146e0 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
146f0 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
14700 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
14710 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
14720 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
14730 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
14740 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
14750 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
14760 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
14770 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
14780 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14790 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
147a0 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
147b0 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
147c0 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
147d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
147e0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
147f0 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
14800 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
14810 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
14820 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
14830 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
14840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14850 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
14860 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
14870 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
14880 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
14890 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
148a0 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
148b0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
148c0 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
148d0 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
148e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
148f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14900 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14910 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
14920 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
14930 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
14940 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
14950 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
14960 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
14970 20 20 20 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72       db->bConcur
14980 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  rent = 0;.      
14990 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
149a0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
149b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
149c0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
149d0 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
149e0 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
149f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
14a00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14a10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14a20 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
14a30 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
14a40 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
14a50 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
14a60 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
14a70 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
14a80 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
14a90 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
14aa0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
14ab0 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
14ac0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
14ad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
14ae0 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
14af0 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
14b00 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
14b10 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
14b20 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
14b30 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
14b40 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
14b50 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
14b60 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
14b70 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
14b80 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
14b90 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  e==(p->readOnly=
14ba0 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
14bb0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14bc0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
14bd0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
14be0 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
14bf0 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
14c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
14c10 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
14c20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
14c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14c40 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
14c50 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
14c60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
14c70 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
14c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
14c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
14ca0 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
14cb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14cc0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14cd0 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
14ce0 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
14cf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
14d00 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
14d10 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
14d20 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
14d30 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
14d40 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
14d50 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
14d60 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
14d70 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
14d80 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
14d90 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
14da0 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
14db0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
14dc0 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
14dd0 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
14de0 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
14df0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
14e00 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
14e10 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
14e20 20 20 20 20 20 20 69 66 28 20 28 72 63 20 26 20        if( (rc & 
14e30 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
14e40 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
14e50 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
14e60 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
14e70 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
14e80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14e90 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
14ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14eb0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
14ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14ed0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
14ee0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
14ef0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
14f00 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
14f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14f20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
14f30 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
14f40 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
14f50 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
14f60 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
14f70 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
14f80 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
14f90 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
14fa0 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
14fb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14fd0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
14fe0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
14ff0 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  K);.        p->n
15000 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
15010 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
15020 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
15030 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
15040 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
15050 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
15060 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
15070 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
15080 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
15090 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
150a0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
150b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
150c0 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
150d0 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
150e0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
150f0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
15100 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
15110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
15120 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
15130 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
15140 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
15150 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
15160 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
15170 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
15180 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
15190 20 20 20 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72       db->bConcur
151a0 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  rent = 0;.      
151b0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
151c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
151d0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
151e0 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
151f0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
15200 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
15210 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
15220 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
15230 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
15240 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
15250 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
15260 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
15270 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
15280 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
15290 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
152a0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
152b0 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
152c0 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
152d0 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
152e0 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
152f0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
15300 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
15310 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
15320 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
15330 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
15340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
15350 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
15360 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
15370 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
15380 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
15390 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
153a0 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
153b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
153c0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
153d0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
153e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
153f0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
15400 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
15410 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
15420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15430 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
15440 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
15450 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
15460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
15470 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
15480 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
15490 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
154a0 20 20 20 20 20 20 20 64 62 2d 3e 62 43 6f 6e 63         db->bConc
154b0 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  urrent = 0;.    
154c0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
154d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
154e0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
154f0 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
15500 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
15510 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
15520 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
15530 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
15540 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
15550 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
15560 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
15570 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
15580 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
15590 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
155a0 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
155b0 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
155c0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
155d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
155e0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
155f0 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
15600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15610 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
15620 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
15630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
15640 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
15650 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
15660 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
15670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
15680 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
15690 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
156a0 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
156b0 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
156c0 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
156d0 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
156e0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
156f0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b  ->nVdbeActive--;
15700 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
15710 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62  dOnly ) db->nVdb
15720 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66  eWrite--;.    if
15730 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
15740 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d   db->nVdbeRead--
15750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
15760 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64  ->nVdbeActive>=d
15770 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
15780 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
15790 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e  nVdbeRead>=db->n
157a0 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20  VdbeWrite );.   
157b0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
157c0 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20  beWrite>=0 );.  
157d0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
157e0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
157f0 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
15800 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
15810 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15820 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
15830 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15840 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
15850 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
15860 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74  flag is set to t
15870 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f  rue, then any lo
15880 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65  cks that were he
15890 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65  ld.  ** by conne
158a0 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f  ction db have no
158b0 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e  w been released.
158c0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e   Call sqlite3Con
158d0 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
158e0 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b  ) .  ** to invok
158f0 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75  e any required u
15900 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
15910 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69  lbacks..  */.  i
15920 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
15930 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15940 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
15950 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61  ed(db);.  }..  a
15960 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
15970 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e  Active>0 || db->
15980 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
15990 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
159a0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
159b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
159c0 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
159d0 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
159e0 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
159f0 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
15a00 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
15a10 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
15a20 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
15a30 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
15a40 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
15a50 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
15a60 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
15a70 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
15a80 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
15a90 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
15aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15ab0 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72  *.** Copy the er
15ac0 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
15ad0 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e  or message belon
15ae0 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45  ging to the VDBE
15af0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
15b00 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
15b10 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65   to its database
15b20 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74   handle (so that
15b30 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a   they will be .*
15b40 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61  * returned by ca
15b50 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  lls to sqlite3_e
15b60 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c  rrcode() and sql
15b70 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a  ite3_errmsg())..
15b80 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
15b90 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65  ion does not cle
15ba0 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f  ar the VDBE erro
15bb0 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67  r code or messag
15bc0 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65  e, just.** copie
15bd0 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61  s them to the da
15be0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
15bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
15c00 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56  eTransferError(V
15c10 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
15c20 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
15c30 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
15c40 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d  ;.  if( p->zErrM
15c50 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42  sg ){.    db->bB
15c60 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20  enignMalloc++;. 
15c70 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
15c80 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
15c90 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d     if( db->pErr=
15ca0 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20  =0 ) db->pErr = 
15cb0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
15cc0 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
15cd0 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
15ce0 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
15cf0 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
15d00 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
15d10 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
15d20 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
15d30 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e  ();.    db->bBen
15d40 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d  ignMalloc--;.  }
15d50 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 70 45 72  else if( db->pEr
15d60 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
15d70 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d  ValueSetNull(db-
15d80 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62  >pErr);.  }.  db
15d90 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
15da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15db0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
15dc0 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a  ABLE_SQLLOG./*.*
15dd0 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43  * If an SQLITE_C
15de0 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f  ONFIG_SQLLOG hoo
15df0 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  k is registered 
15e00 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  and the VM has b
15e10 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76  een run, .** inv
15e20 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  oke it..*/.stati
15e30 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b  c void vdbeInvok
15e40 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29  eSqllog(Vdbe *v)
15e50 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  {.  if( sqlite3G
15e60 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
15e70 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51  log && v->rc==SQ
15e80 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53  LITE_OK && v->zS
15e90 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29  ql && v->pc>=0 )
15ea0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70  {.    char *zExp
15eb0 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56  anded = sqlite3V
15ec0 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20  dbeExpandSql(v, 
15ed0 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73  v->zSql);.    as
15ee0 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69  sert( v->db->ini
15ef0 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
15f00 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29   if( zExpanded )
15f10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
15f20 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
15f30 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73  log(.          s
15f40 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15f50 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76  ig.pSqllogArg, v
15f60 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c  ->db, zExpanded,
15f70 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   1.      );.    
15f80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15f90 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
15fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
15fb0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
15fc0 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78  beInvokeSqllog(x
15fd0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
15fe0 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
15ff0 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
16000 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
16010 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
16020 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
16030 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
16040 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
16050 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
16060 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
16070 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
16080 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
16090 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
160a0 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
160b0 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
160c0 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
160d0 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
160e0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
160f0 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
16100 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
16110 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
16120 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
16130 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
16140 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
16150 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
16160 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
16170 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
16180 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
16190 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
161a0 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
161b0 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20  int i;.#endif.. 
161c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
161d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
161e0 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
161f0 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
16200 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
16210 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
16220 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
16230 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
16240 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
16250 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
16260 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
16270 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
16280 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
16290 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
162a0 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
162b0 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
162c0 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
162d0 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
162e0 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
162f0 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
16300 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
16310 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
16320 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
16330 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
16340 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
16350 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
16360 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
16370 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
16380 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
16390 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
163a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
163b0 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
163c0 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
163d0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
163e0 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g(p);.    sqlite
163f0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
16400 6f 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  or(p);.    if( p
16410 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20  ->runOnlyOnce ) 
16420 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
16430 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
16440 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
16450 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
16460 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
16470 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
16480 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
16490 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
164a0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
164b0 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
164c0 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
164d0 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
164e0 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
164f0 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
16500 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
16510 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
16520 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
16530 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20  hMsg(db, p->rc, 
16540 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  p->zErrMsg ? "%s
16550 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73  " : 0, p->zErrMs
16560 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  g);.  }..  /* Re
16570 73 65 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e  set register con
16580 74 65 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69  tents and reclai
16590 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  m error message 
165a0 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  memory..  */.#if
165b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
165c0 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
165d0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
165e0 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
165f0 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
16600 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
16610 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
16620 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
16630 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
16640 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
16650 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
16660 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
16670 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
16680 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
16690 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
166a0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=0; i<p->nMem;
166b0 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
166c0 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d  >aMem[i].flags==
166d0 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b  MEM_Undefined );
166e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
166f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16700 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
16710 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
16720 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
16730 20 30 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70   0;..  /* Save p
16740 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
16750 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
16760 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
16770 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
16780 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
16790 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
167a0 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
167b0 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
167c0 74 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  t ){.      fprin
167d0 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
167e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
167f0 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
16800 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
16810 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
16820 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
16830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
16840 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
16850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
16860 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zSql ){.        
16870 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a  char c, pc = 0;.
16880 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
16890 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
168a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
168b0 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d   = p->zSql[i])!=
168c0 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
168d0 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20     if( pc=='\n' 
168e0 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
168f0 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  -- ");.         
16900 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20   putc(c, out);. 
16910 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b           pc = c;
16920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16930 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20     if( pc!='\n' 
16940 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
16950 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
16960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16970 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
16980 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31       char zHdr[1
16990 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  00];.        sql
169a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
169b0 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72  zeof(zHdr), zHdr
169c0 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38  , "%6u %12llu %8
169d0 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20  llu ",.         
169e0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
169f0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
16a00 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
16a10 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
16a20 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
16a30 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
16a40 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
16a50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
16a60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
16a70 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20  s", zHdr);.     
16a80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
16a90 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
16aa0 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
16ab0 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
16ac0 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
16ad0 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
16ae0 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
16af0 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  ESET;.  return p
16b00 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
16b10 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
16b20 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
16b30 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
16b40 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
16b50 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
16b60 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
16b70 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
16b80 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
16b90 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
16ba0 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
16bb0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
16bc0 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
16bd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16be0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
16bf0 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
16c00 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
16c10 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
16c20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16c30 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
16c40 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
16c50 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
16c60 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73  )==rc );.  }.  s
16c70 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
16c80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61  ;.}../*.** If pa
16ca0 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c  rameter iOp is l
16cb0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
16cc0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  hen invoke the d
16cd0 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a  estructor for.**
16ce0 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64   all auxiliary d
16cf0 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72  ata pointers cur
16d00 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79  rently cached by
16d10 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
16d20 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  s.** the first a
16d30 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  rgument..**.** O
16d40 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65  r, if iOp is gre
16d50 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
16d60 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  al to zero, then
16d70 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
16d80 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b  is.** only invok
16d90 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78  ed for those aux
16da0 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
16db0 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20  ters created by 
16dc0 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e  the user .** fun
16dd0 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79  ction invoked by
16de0 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e   the OP_Function
16df0 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72   opcode at instr
16e00 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a  uction iOp of .*
16e10 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20  * VM pVdbe, and 
16e20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a  only then if:.**
16e30 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73  .**    * the ass
16e40 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  ociated function
16e50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
16e60 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20  e 32nd or later 
16e70 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20  (counting.**    
16e80 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72    from left to r
16e90 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20  ight), or.**.** 
16ea0 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70     * the corresp
16eb0 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72  onding bit in ar
16ec0 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63  gument mask is c
16ed0 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20  lear (where the 
16ee0 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75  first.**      fu
16ef0 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
16f00 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
16f10 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a  bit 0 etc.)..*/.
16f20 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16f30 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73 71  DeleteAuxData(sq
16f40 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61  lite3 *db, AuxDa
16f50 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70  ta **pp, int iOp
16f60 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77  , int mask){.  w
16f70 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20  hile( *pp ){.   
16f80 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
16f90 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69   *pp;.    if( (i
16fa0 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70  Op<0).     || (p
16fb0 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70  Aux->iAuxOp==iOp
16fc0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 41  .          && pA
16fd0 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20  ux->iAuxArg>=0. 
16fe0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 41 75           && (pAu
16ff0 78 2d 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c  x->iAuxArg>31 ||
17000 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49   !(mask & MASKBI
17010 54 33 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72  T32(pAux->iAuxAr
17020 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
17030 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
17040 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29  x->iAuxArg==31 )
17050 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  ;.      if( pAux
17060 2d 3e 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a  ->xDeleteAux ){.
17070 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
17080 65 6c 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70  eleteAux(pAux->p
17090 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
170a0 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e      *pp = pAux->
170b0 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20  pNextAux;.      
170c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
170d0 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c  , pAux);.    }el
170e0 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70  se{.      pp= &p
170f0 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20  Aux->pNextAux;. 
17100 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
17110 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
17120 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
17130 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
17140 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
17150 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63  argument,.** exc
17160 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69  ept for object i
17170 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20  tself, which is 
17180 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
17190 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
171a0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
171b0 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
171c0 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
171d0 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
171e0 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
171f0 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
17200 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
17210 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17220 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17230 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
17240 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74  frees the object
17250 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64   itself..*/.void
17260 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
17270 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  rObject(sqlite3 
17280 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
17290 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
172a0 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73  b, *pNext;.  ass
172b0 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
172c0 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
172d0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
172e0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
172f0 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
17300 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
17310 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
17320 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
17330 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
17340 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
17350 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
17360 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
17370 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
17380 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17390 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pSub);.  }.  if(
173a0 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
173b0 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
173c0 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
173d0 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
173e0 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ar);.    sqlite3
173f0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56  DbFree(db, p->pV
17400 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
17410 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
17420 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64  pFree);.  }.  vd
17430 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
17440 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
17450 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
17460 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
17470 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
17480 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
17490 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
174a0 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
174b0 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20  NSTATUS.  {.    
174c0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
174d0 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
174e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
174f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
17500 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  >aScan[i].zName)
17510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17520 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
17530 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e  >aScan);.  }.#en
17540 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  dif.}../*.** Del
17550 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
17560 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
17570 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
17580 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
17590 33 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  3 *db;..  assert
175a0 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
175b0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
175c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
175d0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
175e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
175f0 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
17600 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
17610 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
17620 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
17630 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
17640 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
17650 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
17660 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
17670 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
17680 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
17690 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
176a0 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
176b0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
176c0 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
176d0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
176e0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
176f0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
17700 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20   cursor "p" has 
17710 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f  a pending seek o
17720 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61  peration that ha
17730 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
17740 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20  * carried out.  
17750 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20  Seek the cursor 
17760 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  now.  If an erro
17770 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
17780 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
17790 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
177a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
177b0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
177c0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
177d0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
177e0 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63  ){.  int res, rc
177f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17800 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
17810 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
17820 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
17830 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65   assert( p->defe
17840 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20  rredMoveto );.  
17850 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
17860 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
17870 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
17880 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
17890 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
178a0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
178b0 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  p->uc.pCursor, 0
178c0 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
178d0 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  t, 0, &res);.  i
178e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
178f0 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  c;.  if( res!=0 
17900 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
17910 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69  CORRUPT_BKPT;.#i
17920 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
17930 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
17940 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
17950 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
17960 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
17970 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
17980 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
17990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
179a0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
179b0 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
179c0 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
179d0 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
179e0 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
179f0 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
17a00 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
17a10 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
17a20 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
17a30 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
17a40 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
17a50 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
17a60 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
17a70 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
17a80 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
17a90 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
17aa0 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
17ab0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
17ac0 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
17ad0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
17ae0 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
17af0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
17b00 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
17b10 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
17b20 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
17b30 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
17b40 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
17b50 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
17b60 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
17b70 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
17b80 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
17b90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
17ba0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
17bb0 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
17bc0 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d  ursor) );.  rc =
17bd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
17be0 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63  sorRestore(p->uc
17bf0 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66  .pCursor, &isDif
17c00 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d  ferentRow);.  p-
17c10 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
17c20 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
17c30 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  ( isDifferentRow
17c40 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20   ) p->nullRow = 
17c50 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
17c60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
17c70 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
17c80 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
17c90 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20  d.  Restore the 
17ca0 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65  cursor.** if nee
17cb0 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e  d be.  Return an
17cc0 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d  y I/O error from
17cd0 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65   the restore ope
17ce0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
17cf0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
17d00 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73  Restore(VdbeCurs
17d10 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  or *p){.  assert
17d20 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
17d30 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
17d40 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
17d50 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
17d60 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
17d70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
17d80 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
17d90 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
17da0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17db0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
17dc0 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
17dd0 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
17de0 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
17df0 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
17e00 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
17e10 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
17e20 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
17e30 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
17e40 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
17e50 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
17e60 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
17e70 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
17e80 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
17e90 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
17ea0 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
17eb0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
17ec0 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
17ed0 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
17ee0 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
17ef0 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
17f00 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
17f10 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
17f20 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
17f30 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
17f40 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
17f50 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
17f60 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
17f70 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
17f80 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
17f90 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
17fa0 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
17fb0 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
17fc0 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
17fd0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
17fe0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
17ff0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
18000 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
18010 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
18020 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
18030 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c  **pp, int *piCol
18040 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  ){.  VdbeCursor 
18050 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65  *p = *pp;.  asse
18060 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
18070 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c  =CURTYPE_BTREE |
18080 7c 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  | p->eCurType==C
18090 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b  URTYPE_PSEUDO );
180a0 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
180b0 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
180c0 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66  int iMap;.    if
180d0 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20  ( p->aAltMap && 
180e0 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d  (iMap = p->aAltM
180f0 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20  ap[1+*piCol])>0 
18100 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
18110 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20  ->pAltCursor;.  
18120 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61      *piCol = iMa
18130 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  p - 1;.      ret
18140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18150 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
18160 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
18170 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69  veto(p);.  }.  i
18180 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  f( sqlite3BtreeC
18190 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
181a0 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a  >uc.pCursor) ){.
181b0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
181c0 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
181d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
181e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
181f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
18200 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
18210 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18220 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
18230 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
18240 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
18250 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
18260 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
18270 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71  erialPut().** sq
18280 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
18290 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  et().**.** encap
182a0 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
182b0 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
182c0 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
182d0 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
182e0 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
182f0 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
18300 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
18310 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
18320 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
18330 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
18340 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
18350 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
18360 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
18370 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
18380 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
18390 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
183a0 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
183b0 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
183c0 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
183d0 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
183e0 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
183f0 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
18400 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
18410 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
18420 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
18430 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
18440 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
18450 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
18460 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
18470 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
18480 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
18490 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
184a0 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
184b0 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
184c0 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  ob separately..*
184d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
184e0 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
184f0 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
18500 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
18510 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
18520 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
18530 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
18540 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
18550 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
18560 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
18570 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
18580 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185a0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
185b0 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
185e0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
185f0 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
18610 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
18620 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
18630 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
18640 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
18650 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
18660 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
18690 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
186a0 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
186c0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
186d0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
186e0 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
186f0 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
18700 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
18710 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
18740 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
18750 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
18760 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
18770 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
18780 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
187b0 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
187c0 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
187d0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
18800 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
18810 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
18820 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
18830 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
18840 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
18850 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
18860 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
18870 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
18880 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
18890 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
188a0 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
188b0 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
188c0 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
188d0 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
188e0 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
188f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
18900 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
18910 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
18920 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
18930 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
18940 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
18950 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20  nt file_format, 
18960 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e  u32 *pLen){.  in
18970 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
18980 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a  flags;.  u32 n;.
18990 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21  .  assert( pLen!
189a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  =0 );.  if( flag
189b0 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
189c0 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20    *pLen = 0;.   
189d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
189e0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
189f0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
18a00 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
18a10 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
18a20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
18a30 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
18a40 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
18a50 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
18a60 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
18a70 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
18a80 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   u;.    if( i<0 
18a90 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b  ){.      u = ~i;
18aa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18ab0 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20    u = i;.    }. 
18ac0 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b     if( u<=127 ){
18ad0 0a 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29  .      if( (i&1)
18ae0 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d  ==i && file_form
18af0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  at>=4 ){.       
18b00 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20   *pLen = 0;.    
18b10 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33      return 8+(u3
18b20 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  2)u;.      }else
18b30 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
18b40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
18b50 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
18b60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
18b70 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  32767 ){ *pLen =
18b80 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a   2; return 2; }.
18b90 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
18ba0 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b  07 ){ *pLen = 3;
18bb0 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20   return 3; }.   
18bc0 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
18bd0 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b  47 ){ *pLen = 4;
18be0 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20   return 4; }.   
18bf0 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
18c00 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20  E ){ *pLen = 6; 
18c10 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20  return 5; }.    
18c20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
18c30 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
18c40 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
18c50 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
18c60 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   8;.    return 7
18c70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18c80 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
18c90 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
18ca0 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
18cb0 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
18cc0 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20  pMem->n>=0 );.  
18cd0 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e  n = (u32)pMem->n
18ce0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
18cf0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
18d00 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
18d10 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20  ro;.  }.  *pLen 
18d20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  = n;.  return ((
18d30 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
18d40 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
18d50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
18d60 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c  sizes for serial
18d70 20 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e   types less than
18d80 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63   128.*/.static c
18d90 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53  onst u8 sqlite3S
18da0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20  mallTypeSizes[] 
18db0 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20  = {.        /*  
18dc0 30 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20  0   1   2   3   
18dd0 34 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20  4   5   6   7   
18de0 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20  8   9 */   ./*  
18df0 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20   0 */   0,  1,  
18e00 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20  2,  3,  4,  6,  
18e10 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f  8,  8,  0,  0,./
18e20 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30  *  10 */   0,  0
18e30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31  ,  0,  0,  1,  1
18e40 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33  ,  2,  2,  3,  3
18e50 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c  ,./*  20 */   4,
18e60 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c    4,  5,  5,  6,
18e70 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c    6,  7,  7,  8,
18e80 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20    8,./*  30 */  
18e90 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20   9,  9, 10, 10, 
18ea0 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20  11, 11, 12, 12, 
18eb0 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a  13, 13,./*  40 *
18ec0 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31  /  14, 14, 15, 1
18ed0 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31  5, 16, 16, 17, 1
18ee0 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35  7, 18, 18,./*  5
18ef0 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30  0 */  19, 19, 20
18f00 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32  , 20, 21, 21, 22
18f10 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a  , 22, 23, 23,./*
18f20 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c    60 */  24, 24,
18f30 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c   25, 25, 26, 26,
18f40 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c   27, 27, 28, 28,
18f50 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20  ./*  70 */  29, 
18f60 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20  29, 30, 30, 31, 
18f70 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20  31, 32, 32, 33, 
18f80 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33  33,./*  80 */  3
18f90 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33  4, 34, 35, 35, 3
18fa0 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33  6, 36, 37, 37, 3
18fb0 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f  8, 38,./*  90 */
18fc0 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30    39, 39, 40, 40
18fd0 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32  , 41, 41, 42, 42
18fe0 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30  , 43, 43,./* 100
18ff0 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c   */  44, 44, 45,
19000 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c   45, 46, 46, 47,
19010 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20   47, 48, 48,./* 
19020 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20  110 */  49, 49, 
19030 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20  50, 50, 51, 51, 
19040 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a  52, 52, 53, 53,.
19050 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35  /* 120 */  54, 5
19060 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35  4, 55, 55, 56, 5
19070 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a  6, 57, 57.};../*
19080 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
19090 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
190a0 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
190b0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
190c0 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
190d0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
190e0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
190f0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
19100 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
19110 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74  >=128 ){.    ret
19120 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
19130 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
19140 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72  .    assert( ser
19150 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20  ial_type<12 .   
19160 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
19170 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
19180 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d  s[serial_type]==
19190 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
191a0 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75  2)/2 );.    retu
191b0 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
191c0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
191d0 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20  type];.  }.}.u8 
191e0 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79  sqlite3VdbeOneBy
191f0 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  teSerialTypeLen(
19200 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  u8 serial_type){
19210 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61  .  assert( seria
19220 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20  l_type<128 );.  
19230 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d  return sqlite3Sm
19240 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
19250 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a  ial_type];  .}..
19260 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
19270 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
19280 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
19290 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
192a0 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
192b0 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
192c0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
192d0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
192e0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
192f0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
19300 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
19310 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
19320 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
19330 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
19340 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
19350 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
19360 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
19370 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
19380 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
19390 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
193a0 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
193b0 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
193c0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
193d0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
193e0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
193f0 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
19400 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
19410 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
19420 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
19430 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
19440 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
19450 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
19460 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
19470 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
19480 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
19490 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
194a0 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
194b0 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
194c0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
194d0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
194e0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
194f0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
19500 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
19510 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
19520 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
19530 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
19540 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
19550 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
19560 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
19570 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
19580 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
19590 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
195a0 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
195b0 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
195c0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
195d0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
195e0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
195f0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
19600 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
19610 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
19620 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
19630 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
19640 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
19650 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
19660 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
19670 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
19680 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
19690 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
196a0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
196b0 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
196c0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
196d0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
196e0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
196f0 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
19700 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
19710 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
19720 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
19730 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
19740 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
19750 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
19760 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
19770 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
19780 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
19790 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
197a0 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
197b0 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
197c0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
197d0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
197e0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
197f0 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
19800 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
19810 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
19820 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
19830 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
19840 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
19850 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
19860 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
19870 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
19880 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
19890 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
198a0 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
198b0 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
198c0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
198d0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
198e0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
198f0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
19900 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
19910 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
19920 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
19930 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
19940 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
19950 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
19960 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
19970 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
19980 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
19990 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
199a0 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
199b0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
199c0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
199d0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
199e0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
199f0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
19a00 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
19a10 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
19a20 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
19a30 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
19a40 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
19a50 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
19a60 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
19a70 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
19a80 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
19a90 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
19aa0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
19ab0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
19ac0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
19ad0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
19ae0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
19af0 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c  buf[].  The call
19b00 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
19b10 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74  e.** for allocat
19b20 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ing enough space
19b30 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c   to buf[] to hol
19b40 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
19b50 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ld, exclusive.**
19b60 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e   of the pMem->u.
19b70 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20  nZero bytes for 
19b80 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65  a MEM_Zero value
19b90 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
19ba0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
19bb0 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
19bc0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
19bd0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
19be0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
19bf0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
19c00 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
19c10 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
19c20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
19c30 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
19c40 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
19c50 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
19c60 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
19c70 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33  f, Mem *pMem, u3
19c80 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
19c90 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
19ca0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
19cb0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
19cc0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
19cd0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
19ce0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
19cf0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
19d00 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
19d10 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
19d20 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
19d30 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20  em->u.r) );.    
19d40 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
19d50 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28  em->u.r, sizeof(
19d60 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
19d70 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
19d80 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
19d90 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
19da0 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
19db0 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53  n = i = sqlite3S
19dc0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
19dd0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20  rial_type];.    
19de0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
19df0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66     do{.      buf
19e00 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30  [--i] = (u8)(v&0
19e10 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
19e20 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 8;.    }while(
19e30 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   i );.    return
19e40 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
19e50 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
19e60 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
19e70 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
19e80 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
19e90 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
19ea0 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
19eb0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
19ec0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
19ed0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
19ee0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
19ef0 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65  _type) );.    le
19f00 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
19f10 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d   if( len>0 ) mem
19f20 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
19f30 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  , len);.    retu
19f40 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
19f50 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
19f60 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
19f70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
19f80 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73  Input "x" is a s
19f90 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67  equence of unsig
19fa0 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74  ned characters t
19fb0 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a  hat represent a.
19fc0 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  ** big-endian in
19fd0 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74  teger.  Return t
19fe0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61  he equivalent na
19ff0 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
1a000 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45  #define ONE_BYTE
1a010 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29  _INT(x)    ((i8)
1a020 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[0]).#define 
1a030 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  TWO_BYTE_INT(x) 
1a040 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29     (256*(i8)((x)
1a050 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65  [0])|(x)[1]).#de
1a060 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f  fine THREE_BYTE_
1a070 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28  INT(x)  (65536*(
1a080 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
1a090 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a  [1]<<8)|(x)[2]).
1a0a0 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
1a0b0 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33  E_UINT(x)  (((u3
1a0c0 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28  2)(x)[0]<<24)|((
1a0d0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
1a0e0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23  2]<<8)|(x)[3]).#
1a0f0 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
1a100 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31  _INT(x) (1677721
1a110 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
1a120 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
1a130 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
1a140 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
1a150 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
1a160 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
1a170 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
1a180 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
1a190 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
1a1a0 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
1a1b0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1a1c0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
1a1d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1a1e0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1a1f0 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72  ted as two separ
1a200 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ate routines for
1a210 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
1a220 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74   The few cases t
1a230 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61  hat require loca
1a240 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  l variables are 
1a250 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20  broken out into 
1a260 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f  a separate.** ro
1a270 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e  utine so that in
1a280 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20   most cases the 
1a290 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69  overhead of movi
1a2a0 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69  ng the stack poi
1a2b0 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64  nter.** is avoid
1a2c0 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75  ed..*/ .static u
1a2d0 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  32 SQLITE_NOINLI
1a2e0 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20  NE serialGet(.  
1a2f0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1a300 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
1a310 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
1a320 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
1a330 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1a340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a350 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
1a360 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
1a370 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a390 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
1a3a0 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
1a3b0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78  to */.){.  u64 x
1a3c0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1a3d0 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20  T(buf);.  u32 y 
1a3e0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1a3f0 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28  (buf+4);.  x = (
1a400 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66  x<<32) + y;.  if
1a410 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
1a420 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
1a430 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d  NCE-OF: R-29851-
1a440 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61  52272 Value is a
1a450 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62   big-endian 64-b
1a460 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  it.    ** twos-c
1a470 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1a480 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  r. */.    pMem->
1a490 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
1a4a0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
1a4b0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1a4c0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1a4d0 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65  u.i<0 );.  }else
1a4e0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
1a4f0 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39  E-OF: R-57343-49
1a500 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  114 Value is a b
1a510 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37  ig-endian IEEE 7
1a520 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20  54-2008 64-bit. 
1a530 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
1a540 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  oint number. */.
1a550 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
1a560 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
1a570 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
1a580 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
1a590 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1a5a0 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
1a5b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
1a5c0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
1a5d0 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
1a5e0 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20  r.  Or, that if 
1a5f0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
1a600 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20  IAN_64BIT_FLOAT 
1a610 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  is.    ** define
1a620 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
1a630 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
1a640 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
1a650 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69  ixed.    ** endi
1a660 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  an..    */.    s
1a670 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
1a680 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
1a690 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
1a6a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
1a6b0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
1a6c0 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20    u64 t2 = t1;. 
1a6d0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
1a6e0 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
1a6f0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1a700 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20  r1)==sizeof(t2) 
1a710 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26  && memcmp(&r1, &
1a720 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t2, sizeof(r1))=
1a730 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =0 );.#endif.   
1a740 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1a750 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
1a760 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b  pMem->u.r)==8 );
1a770 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
1a780 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
1a790 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
1a7a0 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  u.r, &x, sizeof(
1a7b0 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  x));.    pMem->f
1a7c0 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
1a7d0 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f  NaN(pMem->u.r) ?
1a7e0 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
1a7f0 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Real;.  }.  retu
1a800 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  rn 8;.}.u32 sqli
1a810 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1a820 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
1a830 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
1a840 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
1a850 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
1a860 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
1a870 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
1a880 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1a890 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
1a8a0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
1a8d0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
1a8e0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
1a8f0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1a900 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
1a910 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
1a920 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
1a930 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
1a940 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
1a950 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
1a960 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
1a970 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  * Null */.      
1a980 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a990 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61  R-24078-09375 Va
1a9a0 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a  lue is a NULL. *
1a9b0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
1a9c0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
1a9d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a9e0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
1a9f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1aa00 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32  CE-OF: R-44885-2
1aa10 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e  5196 Value is an
1aa20 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70   8-bit twos-comp
1aa30 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  lement.      ** 
1aa40 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1aa50 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e    pMem->u.i = ON
1aa60 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
1aa70 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1aa80 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1aa90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1aaa0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1aab0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1aac0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
1aad0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
1aae0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1aaf0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1ab00 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36  F: R-49794-35026
1ab10 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1ab20 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20  endian 16-bit.  
1ab30 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1ab40 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1ab50 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1ab60 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  .i = TWO_BYTE_IN
1ab70 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1ab80 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1ab90 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1aba0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1abb0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1abc0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
1abd0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
1abe0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1abf0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1ac00 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33  DENCE-OF: R-3783
1ac10 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73  9-54301 Value is
1ac20 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34   a big-endian 24
1ac30 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1ac40 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1ac50 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1ac60 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45  pMem->u.i = THRE
1ac70 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
1ac80 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1ac90 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1aca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1acb0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1acc0 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
1acd0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
1ace0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
1acf0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1ad00 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1ad10 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39  F: R-01849-26079
1ad20 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1ad30 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20  endian 32-bit.  
1ad40 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1ad50 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1ad60 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1ad70 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49  .i = FOUR_BYTE_I
1ad80 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20  NT(buf);.#ifdef 
1ad90 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f  __HP_cc .      /
1ada0 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  * Work around a 
1adb0 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62  sign-extension b
1adc0 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d  ug in the HP com
1add0 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20  piler for HP/UX 
1ade0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66  */.      if( buf
1adf0 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d  [0]&0x80 ) pMem-
1ae00 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66  >u.i |= 0xffffff
1ae10 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65  ff80000000LL;.#e
1ae20 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ndif.      pMem-
1ae30 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1ae40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ae50 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1ae60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
1ae70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ae80 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
1ae90 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1aea0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1aeb0 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30  CE-OF: R-50385-0
1aec0 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20  9674 Value is a 
1aed0 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69  big-endian 48-bi
1aee0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1aef0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1af00 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1af10 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
1af20 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b  TE_UINT(buf+2) +
1af30 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1af40 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
1af50 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
1af60 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1af70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1af80 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1af90 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
1afa0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1afb0 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
1afc0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1afd0 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
1afe0 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
1aff0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
1b000 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20  These use local 
1b010 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f  variables, so do
1b020 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72   them in a separ
1b030 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  ate routine.    
1b040 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61    ** to avoid ha
1b050 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65  ving to move the
1b060 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69   frame pointer i
1b070 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1b080 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1b090 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c  n serialGet(buf,
1b0a0 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d  serial_type,pMem
1b0b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1b0c0 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
1b0d0 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
1b0e0 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
1b0f0 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  r 1 */.      /* 
1b100 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1b110 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65  2976-22893 Value
1b120 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
1b130 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  0. */.      /* E
1b140 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
1b150 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20  143-12121 Value 
1b160 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31  is the integer 1
1b170 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1b180 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
1b190 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
1b1a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1b1b0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
1b1c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
1b1d0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
1b1e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1b1f0 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75  14606-31564 Valu
1b200 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74  e is a BLOB that
1b210 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74   is (N-12)/2 byt
1b220 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c  es in.      ** l
1b230 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  ength..      ** 
1b240 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1b250 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65  8401-00140 Value
1b260 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20   is a string in 
1b270 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
1b280 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  g and.      ** (
1b290 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e  N-13)/2 bytes in
1b2a0 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20   length. */.    
1b2b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1b2c0 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
1b2d0 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65  EM_Blob|MEM_Ephe
1b2e0 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45  m, MEM_Str|MEM_E
1b2f0 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d  phem };.      pM
1b300 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
1b310 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
1b320 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  >n = (serial_typ
1b330 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
1b340 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
1b350 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
1b360 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
1b370 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20  pMem->n;.    }. 
1b380 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1b390 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b3a0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
1b3b0 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
1b3c0 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
1b3d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
1b3e0 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
1b3f0 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
1b400 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
1b410 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1b420 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
1b430 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1b440 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
1b450 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
1b460 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
1b470 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
1b480 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
1b490 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
1b4a0 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
1b4b0 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
1b4c0 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
1b4d0 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
1b4e0 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
1b4f0 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
1b500 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
1b510 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
1b520 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
1b530 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
1b540 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
1b550 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
1b560 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
1b570 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
1b580 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
1b590 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
1b5a0 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
1b5b0 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
1b5c0 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
1b5d0 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
1b5e0 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
1b5f0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
1b600 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
1b610 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
1b620 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
1b630 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
1b640 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
1b650 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
1b660 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b680 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1b690 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  the record */.){
1b6a0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1b6b0 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
1b6c0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
1b6d0 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
1b6e0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b710 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
1b720 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79   for *p */.  nBy
1b730 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
1b740 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1b750 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
1b760 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  )*(pKeyInfo->nKe
1b770 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d  yField+1);.  p =
1b780 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1b790 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1b7a0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
1b7b0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
1b7c0 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
1b7d0 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65  .  p->aMem = (Me
1b7e0 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52  m*)&((char*)p)[R
1b7f0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1b800 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a  ackedRecord))];.
1b810 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b820 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1b830 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  0 );.  p->pKeyIn
1b840 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1b850 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
1b860 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
1b870 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   + 1;.  return p
1b880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1b890 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
1b8a0 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
1b8b0 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
1b8c0 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20  opulate the .** 
1b8d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
1b8e0 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
1b8f0 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68  ed by the fourth
1b900 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74   argument with t
1b910 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
1b920 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65  f the decoded re
1b930 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  cord..*/ .void s
1b940 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b950 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
1b960 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1b970 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1b980 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
1b990 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
1b9a0 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
1b9b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b9c0 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1b9d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1b9e0 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
1b9f0 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
1ba00 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1ba10 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a  ecord *p      /*
1ba20 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73   Populate this s
1ba30 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20  tructure before 
1ba40 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b  returning. */.){
1ba50 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1ba60 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1ba70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ba80 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e  har *)pKey;.  in
1ba90 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b  t d; .  u32 idx;
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1bac0 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72  t in aKey[] to r
1bad0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31  ead from */.  u1
1bae0 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bb00 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1bb10 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
1bb20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
1bb30 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20  em = p->aMem;.. 
1bb40 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d   p->default_rc =
1bb50 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
1bb60 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
1bb70 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
1bb80 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
1bb90 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
1bba0 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
1bbb0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
1bbc0 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65  <szHdr && d<=nKe
1bbd0 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
1bbe0 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
1bbf0 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1bc00 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
1bc10 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1bc20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
1bc30 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
1bc40 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
1bc50 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
1bc60 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
1bc70 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
1bc80 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
1bc90 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
1bca0 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61  /.    pMem->szMa
1bcb0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d  lloc = 0;.    pM
1bcc0 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64  em->z = 0;.    d
1bcd0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1bce0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64  erialGet(&aKey[d
1bcf0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1bd00 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b  pMem);.    pMem+
1bd10 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29  +;.    if( (++u)
1bd20 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72  >=p->nField ) br
1bd30 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  eak;.  }.  asser
1bd40 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
1bd50 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b  nKeyField + 1 );
1bd60 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
1bd70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1bd80 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
1bd90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1bda0 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
1bdb0 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
1bdc0 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
1bdd0 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
1bde0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1bdf0 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
1be00 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
1be10 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
1be20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1be30 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
1be40 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
1be50 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
1be60 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1be70 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
1be80 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
1be90 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
1bea0 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
1beb0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
1bec0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1bed0 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
1bee0 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
1bef0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1bf00 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
1bf10 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
1bf20 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
1bf30 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1bf40 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
1bf50 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
1bf60 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
1bf70 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
1bf80 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
1bf90 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
1bfa0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1bfb0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1bfc0 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
1bfd0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1bfe0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1bff0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
1c000 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
1c010 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
1c020 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1c030 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
1c040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1c050 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
1c060 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1c070 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1c080 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1c090 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1c0a0 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
1c0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1c0c0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1c0d0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
1c0e0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
1c0f0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
1c100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1c110 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
1c120 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
1c130 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
1c140 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c150 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1c160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1c170 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
1c180 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
1c190 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
1c1a0 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1c1b0 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
1c1c0 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
1c1d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
1c1e0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1c1f0 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
1c200 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1c210 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
1c220 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
1c230 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1c240 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1c250 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
1c260 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1c270 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1c280 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1c290 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1c2a0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
1c2b0 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
1c2c0 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
1c2d0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
1c2e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1c2f0 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
1c300 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
1c310 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
1c320 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
1c330 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
1c340 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
1c350 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
1c360 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
1c370 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
1c380 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
1c390 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
1c3a0 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
1c3b0 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
1c3c0 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
1c3d0 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
1c3e0 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
1c3f0 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
1c400 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
1c410 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
1c420 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
1c430 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
1c440 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
1c450 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
1c460 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
1c470 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
1c480 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
1c490 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
1c4a0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1c4b0 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
1c4c0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1c4d0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66  1, szHdr1);.  if
1c4e0 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29  ( szHdr1>98307 )
1c4f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1c500 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73  ORRUPT;.  d1 = s
1c510 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
1c520 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1c530 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1c540 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ield || CORRUPT_
1c550 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1c560 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1c570 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1c580 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1c590 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  KeyField>0 );.  
1c5a0 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1c5b0 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1c5c0 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1c5d0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
1c5e0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
1c5f0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
1c600 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
1c610 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
1c620 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
1c630 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
1c640 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
1c650 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
1c660 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1c670 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
1c680 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
1c690 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
1c6a0 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
1c6b0 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
1c6c0 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
1c6d0 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
1c6e0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
1c6f0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
1c700 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
1c710 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
1c720 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
1c730 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
1c740 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
1c750 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
1c760 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
1c770 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
1c780 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
1c790 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1c7a0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1c7b0 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
1c7c0 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
1c7d0 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
1c7e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1c7f0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1c800 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
1c810 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
1c820 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c830 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1c840 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
1c850 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1c860 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1c870 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1c880 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1c890 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
1c8a0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
1c8b0 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
1c8c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
1c8d0 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
1c8e0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
1c8f0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1c900 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
1c910 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1c920 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1c930 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1c940 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1c950 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  /.      if( pKey
1c960 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1c970 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1c980 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76  c = -rc;  /* Inv
1c990 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  ert the result f
1c9a0 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  or DESC sort ord
1c9b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  er. */.      }. 
1c9c0 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43       goto debugC
1c9d0 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d  ompareEnd;.    }
1c9e0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
1c9f0 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
1ca00 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1ca10 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
1ca20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1ca30 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1ca40 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1ca50 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1ca60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1ca70 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1ca80 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1ca90 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1caa0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1cab0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1cac0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1cad0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
1cae0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1caf0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1cb00 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1cb10 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1cb20 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
1cb30 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1cb40 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1cb50 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1cb60 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1cb70 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1cb80 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1cb90 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63   value.  */.  rc
1cba0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1cbb0 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d  lt_rc;..debugCom
1cbc0 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64  pareEnd:.  if( d
1cbd0 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20  esiredResult==0 
1cbe0 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72  && rc==0 ) retur
1cbf0 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1cc00 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63  edResult<0 && rc
1cc10 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
1cc20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1cc30 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72  lt>0 && rc>0 ) r
1cc40 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43  eturn 1;.  if( C
1cc50 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1cc60 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79  rn 1;.  if( pKey
1cc70 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1cc80 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1cc90 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
1cca0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1ccb0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1ccc0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1ccd0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61  ber of fields (a
1cce0 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69  .k.a. columns) i
1ccf0 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76  n the record giv
1cd00 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b  en by.** pKey,nK
1cd10 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20  ey.  The verify 
1cd20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20  that this count 
1cd30 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1cd40 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20  equal to the.** 
1cd50 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70  limit given by p
1cd60 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1cd70 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1cd80 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1cd90 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1cda0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1cdb0 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1cdc0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1cdd0 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1cde0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1cdf0 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1ce00 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1ce10 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1ce20 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1ce30 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1ce40 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1ce50 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65   the KeyInfo.nKe
1ce60 79 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66  yField or KeyInf
1ce70 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75  o.nAllField valu
1ce80 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1ce90 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1cea0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ceb0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1cec0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1ced0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1cee0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1cef0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1cf00 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1cf10 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1cf20 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1cf30 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1cf40 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1cf50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1cf60 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1cf70 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1cf80 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1cf90 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1cfa0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1cfb0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1cfc0 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1cfd0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1cfe0 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1cff0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1d000 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1d010 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1d020 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1d030 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1d040 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1d050 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1d060 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1d070 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1d080 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1d090 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1d0a0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1d0b0 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  ield );.}.#else.
1d0c0 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73  # define vdbeAss
1d0d0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1d0e0 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29  hinLimits(A,B,C)
1d0f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42  .#endif../*.** B
1d100 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a  oth *pMem1 and *
1d110 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74  pMem2 contain st
1d120 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ring values. Com
1d130 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c  pare the two val
1d140 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ues.** using the
1d150 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1d160 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73  nce pColl. As us
1d170 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65  ual, return a ne
1d180 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a  gative , zero.**
1d190 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c   or positive val
1d1a0 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20  ue if *pMem1 is 
1d1b0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1d1c0 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74   to or greater t
1d1d0 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20  han .** *pMem2, 
1d1e0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69  respectively. Si
1d1f0 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20  milar in spirit 
1d200 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31  to "rc = (*pMem1
1d210 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a  ) - (*pMem2);"..
1d220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1d230 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1d240 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  ng(.  const Mem 
1d250 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20  *pMem1,.  const 
1d260 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f  Mem *pMem2,.  co
1d270 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1d280 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72  ll,.  u8 *prcErr
1d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2a0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f        /* If an O
1d2b0 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  OM occurs, set t
1d2c0 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a  o SQLITE_NOMEM *
1d2d0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31  /.){.  if( pMem1
1d2e0 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
1d2f0 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  c ){.    /* The 
1d300 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65  strings are alre
1d310 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ady in the corre
1d320 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61  ct encoding.  Ca
1d330 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63  ll the.     ** c
1d340 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1d350 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20  on directly */. 
1d360 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d     return pColl-
1d370 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1d380 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d  er,pMem1->n,pMem
1d390 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d  1->z,pMem2->n,pM
1d3a0 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65  em2->z);.  }else
1d3b0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1d3c0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31    const void *v1
1d3d0 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63  , *v2;.    Mem c
1d3e0 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20  1;.    Mem c2;. 
1d3f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1d400 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31  mInit(&c1, pMem1
1d410 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1d420 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d430 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65  MemInit(&c2, pMe
1d440 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1d450 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d460 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1d470 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d  (&c1, pMem1, MEM
1d480 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c  _Ephem);.    sql
1d490 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
1d4a0 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d  owCopy(&c2, pMem
1d4b0 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  2, MEM_Ephem);. 
1d4c0 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56     v1 = sqlite3V
1d4d0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1d4e0 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43  3_value*)&c1, pC
1d4f0 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76  oll->enc);.    v
1d500 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  2 = sqlite3Value
1d510 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1d520 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d  lue*)&c2, pColl-
1d530 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28  >enc);.    if( (
1d540 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20  v1==0 || v2==0) 
1d550 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 63  ){.      if( prc
1d560 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20  Err ) *prcErr = 
1d570 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1d580 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  T;.      rc = 0;
1d590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d5a0 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43    rc = pColl->xC
1d5b0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1d5c0 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c   c1.n, v1, c2.n,
1d5d0 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   v2);.    }.    
1d5e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1d5f0 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20  lease(&c1);.    
1d600 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1d610 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20  lease(&c2);.    
1d620 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d  return rc;.  }.}
1d630 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
1d640 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61  t pBlob is guara
1d650 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c  nteed to be a Bl
1d660 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d  ob that is not m
1d670 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45  arked.** with ME
1d680 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  M_Zero.  Return 
1d690 74 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64  true if it could
1d6a0 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e   be a zero-blob.
1d6b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1d6c0 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63  sAllZero(const c
1d6d0 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
1d6e0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1d6f0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1d700 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65     if( z[i] ) re
1d710 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
1d720 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
1d730 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f   Compare two blo
1d740 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  bs.  Return nega
1d750 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1d760 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1d770 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20  irst.** is less 
1d780 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1d790 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1d7a0 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70  the second, resp
1d7b0 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20  ectively..** If 
1d7c0 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72  one blob is a pr
1d7d0 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65  efix of the othe
1d7e0 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72  r, then the shor
1d7f0 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f  ter is the lesso
1d800 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  r..*/.static SQL
1d810 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
1d820 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1d830 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1d840 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  B1, const Mem *p
1d850 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  B2){.  int c;.  
1d860 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b  int n1 = pB1->n;
1d870 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d  .  int n2 = pB2-
1d880 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  >n;..  /* It is 
1d890 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65  possible to have
1d8a0 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68   a Blob value th
1d8b0 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d  at has some non-
1d8c0 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  zero content.  *
1d8d0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  * followed by ze
1d8e0 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74  ro content.  But
1d8f0 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73   that only comes
1d900 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f   up for Blobs fo
1d910 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  rmed.  ** by the
1d920 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1d930 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20  pcode, and such 
1d940 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20  Blobs never get 
1d950 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
1d960 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1d970 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  re(). */.  asser
1d980 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26  t( (pB1->flags &
1d990 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c   MEM_Zero)==0 ||
1d9a0 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65   n1==0 );.  asse
1d9b0 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20  rt( (pB2->flags 
1d9c0 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1d9d0 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  | n2==0 );..  if
1d9e0 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42  ( (pB1->flags|pB
1d9f0 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f  2->flags) & MEM_
1da00 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20  Zero ){.    if( 
1da10 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32  pB1->flags & pB2
1da20 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1da30 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ro ){.      retu
1da40 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20  rn pB1->u.nZero 
1da50 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a  - pB2->u.nZero;.
1da60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42      }else if( pB
1da70 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  1->flags & MEM_Z
1da80 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ero ){.      if(
1da90 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d   !isAllZero(pB2-
1daa0 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65  >z, pB2->n) ) re
1dab0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72  turn -1;.      r
1dac0 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65  eturn pB1->u.nZe
1dad0 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c  ro - n2;.    }el
1dae0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69  se{.      if( !i
1daf0 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c  sAllZero(pB1->z,
1db00 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72   pB1->n) ) retur
1db10 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1db20 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e  rn n1 - pB2->u.n
1db30 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Zero;.    }.  }.
1db40 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31    c = memcmp(pB1
1db50 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e  ->z, pB2->z, n1>
1db60 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20  n2 ? n2 : n1);. 
1db70 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20   if( c ) return 
1db80 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d  c;.  return n1 -
1db90 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f   n2;.}../*.** Do
1dba0 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65   a comparison be
1dbb0 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73  tween a 64-bit s
1dbc0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e  igned integer an
1dbd0 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  d a 64-bit float
1dbe0 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing-point.** num
1dbf0 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  ber.  Return neg
1dc00 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1dc10 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1dc20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20 6c  first (i64) is l
1dc30 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75  ess than,.** equ
1dc40 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1dc50 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1dc60 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73  d (double)..*/.s
1dc70 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1dc80 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1dc90 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72  (i64 i, double r
1dca0 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  ){.  if( sizeof(
1dcb0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1dcc0 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f  >8 ){.    LONGDO
1dcd0 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c  UBLE_TYPE x = (L
1dce0 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69  ONGDOUBLE_TYPE)i
1dcf0 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 20  ;.    if( x<r ) 
1dd00 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1dd10 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20  f( x>r ) return 
1dd20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1dd30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1dd40 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  64 y;.    double
1dd50 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39   s;.    if( r<-9
1dd60 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1dd70 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31  08.0 ) return +1
1dd80 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32 33  ;.    if( r>9223
1dd90 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 2e  372036854775807.
1dda0 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1ddb0 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20     y = (i64)r;. 
1ddc0 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65 74     if( i<y ) ret
1ddd0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1dde0 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  i>y ){.      if(
1ddf0 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54   y==SMALLEST_INT
1de00 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65  64 && r>0.0 ) re
1de10 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72  turn -1;.      r
1de20 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a  eturn +1;.    }.
1de30 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29      s = (double)
1de40 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29  i;.    if( s<r )
1de50 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1de60 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e  if( s>r ) return
1de70 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1de80 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1de90 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
1dea0 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
1deb0 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
1dec0 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
1ded0 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
1dee0 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
1def0 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
1df00 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1df10 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
1df20 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
1df30 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
1df40 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
1df50 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
1df60 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
1df70 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
1df80 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
1df90 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
1dfa0 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   by the collatin
1dfb0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43  g.** sequence pC
1dfc0 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  oll and finally 
1dfd0 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
1dfe0 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
1dff0 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
1e000 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1e010 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
1e020 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1e030 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1e040 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  e(const Mem *pMe
1e050 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  m1, const Mem *p
1e060 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c  Mem2, const Coll
1e070 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
1e080 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74  nt f1, f2;.  int
1e090 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b   combined_flags;
1e0a0 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e  ..  f1 = pMem1->
1e0b0 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d  flags;.  f2 = pM
1e0c0 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f  em2->flags;.  co
1e0d0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66  mbined_flags = f
1e0e0 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20  1|f2;.  assert( 
1e0f0 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20  (combined_flags 
1e100 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
1e110 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e   );. .  /* If on
1e120 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  e value is NULL,
1e130 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1e140 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62   the other. If b
1e150 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  oth values.  ** 
1e160 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  are NULL, return
1e170 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63   0..  */.  if( c
1e180 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1e190 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
1e1a0 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c  turn (f2&MEM_Nul
1e1b0 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c  l) - (f1&MEM_Nul
1e1c0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  l);.  }..  /* At
1e1d0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
1e1e0 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20  e two values is 
1e1f0 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20  a number.  */.  
1e200 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1e210 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  gs&(MEM_Int|MEM_
1e220 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  Real) ){.    if(
1e230 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
1e240 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1e250 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1e260 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  < pMem2->u.i ) r
1e270 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1e280 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e  if( pMem1->u.i >
1e290 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1e2a0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1e2b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1e2c0 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1e2d0 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  & MEM_Real)!=0 )
1e2e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1e2f0 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.r < pMem2->
1e300 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.r ) return -1;
1e310 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1e320 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.r > pMem2->u
1e330 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .r ) return +1;.
1e340 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e350 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1e360 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  1&MEM_Int)!=0 ){
1e370 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1e380 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1e390 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
1e3a0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1e3b0 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c  pare(pMem1->u.i,
1e3c0 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20   pMem2->u.r);.  
1e3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e3e0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1e3f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e400 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
1e410 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1e420 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f2&MEM_Int)!=
1e430 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1e440 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  urn -sqlite3IntF
1e450 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1e460 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75  2->u.i, pMem1->u
1e470 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1e480 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1e490 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1e4a0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31   }.    return +1
1e4b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  ;.  }..  /* If o
1e4c0 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  ne value is a st
1e4d0 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68  ring and the oth
1e4e0 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68  er is a blob, th
1e4f0 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73  e string is less
1e500 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
1e510 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70  re strings, comp
1e520 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f  are using the co
1e530 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
1e540 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  s..  */.  if( co
1e550 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1e560 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20  _Str ){.    if( 
1e570 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f1 & MEM_Str)==
1e580 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1e590 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
1e5a0 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72  f( (f2 & MEM_Str
1e5b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1e5c0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
1e5d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1e5e0 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65  1->enc==pMem2->e
1e5f0 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d  nc || pMem1->db-
1e600 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1e610 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1e620 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1e630 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20  UTF8 || .       
1e640 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d       pMem1->enc=
1e650 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
1e660 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  || pMem1->enc==S
1e670 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
1e680 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ..    /* The col
1e690 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1e6a0 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20  must be defined 
1e6b0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65  at this point, e
1e6c0 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ven if.    ** th
1e6d0 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74  e user deletes t
1e6e0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1e6f0 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20  uence after the 
1e700 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a  vdbe program is.
1e710 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
1e720 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c  (this was not al
1e730 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a  ways the case)..
1e740 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1e750 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f  t( !pColl || pCo
1e760 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20  ll->xCmp );..   
1e770 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
1e780 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
1e790 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1e7a0 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43  pMem1, pMem2, pC
1e7b0 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  oll, 0);.    }. 
1e7c0 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20     /* If a NULL 
1e7d0 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73  pointer was pass
1e7e0 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74  ed as the collat
1e7f0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c  e function, fall
1e800 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
1e810 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65  to the blob case
1e820 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
1e830 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f  ).  */.  }. .  /
1e840 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
1e850 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f  st be blobs.  Co
1e860 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63  mpare using memc
1e870 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75  mp().  */.  retu
1e880 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  rn sqlite3BlobCo
1e890 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65  mpare(pMem1, pMe
1e8a0 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  m2);.}.../*.** T
1e8b0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1e8c0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1e8d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
1e8e0 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a  erial-type that.
1e8f0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ** corresponds t
1e900 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61  o an integer - a
1e910 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  ll values betwee
1e920 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73  n 1 and 9 inclus
1e930 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37  ive .** except 7
1e940 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69  . The second poi
1e950 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
1e960 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e  containing an in
1e970 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73  teger value.** s
1e980 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64  erialized accord
1e990 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79  ing to serial_ty
1e9a0 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  pe. This functio
1e9b0 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a  n deserializes.*
1e9c0 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  * and returns th
1e9d0 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  e value..*/.stat
1e9e0 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72  ic i64 vdbeRecor
1e9f0 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73  dDecodeInt(u32 s
1ea00 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73  erial_type, cons
1ea10 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
1ea20 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20  32 y;.  assert( 
1ea30 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73  CORRUPT_DB || (s
1ea40 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26  erial_type>=1 &&
1ea50 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20   serial_type<=9 
1ea60 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  && serial_type!=
1ea70 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  7) );.  switch( 
1ea80 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1ea90 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63     case 0:.    c
1eaa0 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73  ase 1:.      tes
1eab0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1eac0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1ead0 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  urn ONE_BYTE_INT
1eae0 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1eaf0 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   2:.      testca
1eb00 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1eb10 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1eb20 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1eb30 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a  ey);.    case 3:
1eb40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1eb50 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1eb60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48  .      return TH
1eb70 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1eb80 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20  y);.    case 4: 
1eb90 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1eba0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1ebb0 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  ;.      y = FOUR
1ebc0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1ebd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
1ebe0 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1ebf0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1ec00 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1ec10 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1ec20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ec30 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1ec40 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1ec50 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1ec60 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1ec70 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a  }.    case 6: {.
1ec80 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f        u64 x = FO
1ec90 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1eca0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1ecb0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1ecc0 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78   );.      x = (x
1ecd0 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1ece0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1ecf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1ed00 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  4)*(i64*)&x;.   
1ed10 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1ed20 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1ed30 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  8);.}../*.** Thi
1ed40 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1ed50 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
1ed60 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
1ed70 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
1ed80 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
1ed90 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
1eda0 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
1edb0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
1edc0 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
1edd0 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
1ede0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1edf0 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
1ee00 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
1ee10 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
1ee20 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
1ee30 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
1ee40 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
1ee50 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
1ee60 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
1ee70 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
1ee80 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
1ee90 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
1eea0 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
1eeb0 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
1eec0 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  rd..**.** If arg
1eed0 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e  ument bSkip is n
1eee0 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  on-zero, it is a
1eef0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1ef00 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1ef10 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  dy.** determined
1ef20 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1ef30 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65  fields of the ke
1ef40 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a  ys are equal..**
1ef50 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
1ef60 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
1ef70 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
1ef80 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1ef90 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66  ds. If all .** f
1efa0 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61  ields that appea
1efb0 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61  r in both keys a
1efc0 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70  re equal, then p
1efd0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1efe0 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  c is .** returne
1eff0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  d..**.** If data
1f000 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1f010 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73  is discovered, s
1f020 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  et pPKey2->errCo
1f030 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45  de to .** SQLITE
1f040 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74  _CORRUPT and ret
1f050 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d  urn 0. If an OOM
1f060 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1f070 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79  tered, .** pPKey
1f080 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65  2->errCode is se
1f090 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1f0a0 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20  M and, if it is 
1f0b0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a  not NULL, the.**
1f0c0 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
1f0d0 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62  lag set on datab
1f0e0 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65  ase handle (pPKe
1f0f0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
1f100 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1f110 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1f120 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e  reWithSkip(.  in
1f130 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1f140 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
1f150 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1f160 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1f170 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f  PKey2,         /
1f180 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
1f190 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20   int bSkip      
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69   /* If true, ski
1f1c0 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  p the first fiel
1f1d0 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  d */.){.  u32 d1
1f1e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1f200 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1f210 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1f220 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ment */.  int i;
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1f250 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64  ex of next field
1f260 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
1f270 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f   /* Size of reco
1f2a0 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  rd header in byt
1f2b0 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  es */.  u32 idx1
1f2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f2d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1f2e0 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20  t of first type 
1f2f0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1f300 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f320 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1f330 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20  /.  Mem *pRhs = 
1f340 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20  pPKey2->aMem;   
1f350 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c      /* Next fiel
1f360 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63  d of pPKey2 to c
1f370 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49  ompare */.  KeyI
1f380 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1f390 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1f3a0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1f3b0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1f3c0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1f3d0 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1f3e0 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a   Mem mem1;..  /*
1f3f0 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75   If bSkip is tru
1f400 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
1f410 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  er has already d
1f420 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1f430 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
1f440 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
1f450 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
1f460 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75  . Fix the variou
1f470 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
1f480 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  s so.  ** that t
1f490 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69  his routine begi
1f4a0 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20  ns comparing at 
1f4b0 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64  the second field
1f4c0 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70  . */.  if( bSkip
1f4d0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a   ){.    u32 s1;.
1f4e0 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67      idx1 = 1 + g
1f4f0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1f500 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73  1[1], s1);.    s
1f510 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d  zHdr1 = aKey1[0]
1f520 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1f530 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53  1 + sqlite3VdbeS
1f540 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29  erialTypeLen(s1)
1f550 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
1f560 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65   pRhs++;.  }else
1f570 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74  {.    idx1 = get
1f580 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1f590 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20  szHdr1);.    d1 
1f5a0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66  = szHdr1;.    if
1f5b0 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e  ( d1>(unsigned)n
1f5c0 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70  Key1 ){ .      p
1f5d0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1f5e0 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1f5f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1f600 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
1f610 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1f620 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  }.    i = 0;.  }
1f630 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
1f640 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1f650 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1f660 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1f670 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73  atements */.  as
1f680 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1f690 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1f6a0 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1f6b0 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1f6c0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1f6d0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1f6e0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1f6f0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1f700 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1f710 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20  fo->nKeyField>0 
1f720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1f730 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1f740 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1f750 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1f760 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
1f770 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
1f780 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
1f790 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1f7a0 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1f7b0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1f7c0 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
1f7d0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1f7e0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1f7f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1f800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1f810 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1f820 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1f830 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1f840 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1f850 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1f860 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1f870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1f880 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1f890 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1f8a0 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1f8b0 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e   rc = -sqlite3In
1f8c0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52  tFloatCompare(pR
1f8d0 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e  hs->u.i, mem1.u.
1f8e0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1f8f0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73  .        i64 lhs
1f900 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63   = vdbeRecordDec
1f910 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79  odeInt(serial_ty
1f920 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b  pe, &aKey1[d1]);
1f930 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73  .        i64 rhs
1f940 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20   = pRhs->u.i;.  
1f950 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
1f960 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1f970 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1f980 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
1f990 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1f9a0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1f9b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f9c0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72  .    /* RHS is r
1f9d0 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  eal */.    else 
1f9e0 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1f9f0 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
1fa00 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1fa10 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1fa20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1fa30 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
1fa40 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
1fa50 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65  pes 12 or greate
1fa60 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e  r are strings an
1fa70 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72  d blobs (greater
1fa80 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a   than.        **
1fa90 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73   numbers). Types
1faa0 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63   10 and 11 are c
1fab0 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76  urrently "reserv
1fac0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20  ed for future . 
1fad0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20         ** use", 
1fae0 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65  so it doesn't re
1faf0 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74  ally matter what
1fb00 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1fb10 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20  comparing.      
1fb20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d    ** them to num
1fb30 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65  beric values are
1fb40 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
1fb50 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1fb60 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1fb70 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1fb80 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1fb90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1fba0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1fbb0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1fbc0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1fbd0 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
1fbe0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1fbf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1fc00 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e   mem1.u.r<pRhs->
1fc10 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
1fc20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1fc30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fc40 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75  mem1.u.r>pRhs->u
1fc50 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1fc60 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1fc70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1fc80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fc90 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46  rc = sqlite3IntF
1fca0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31  loatCompare(mem1
1fcb0 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29  .u.i, pRhs->u.r)
1fcc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fcd0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fce0 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e  * RHS is a strin
1fcf0 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  g */.    else if
1fd00 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1fd10 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
1fd20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1fd30 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1fd40 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1fd50 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1fd60 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1fd70 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1fd80 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e<12 ){.        
1fd90 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1fda0 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
1fdb0 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1fdc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1fdd0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1fde0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d          mem1.n =
1fdf0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1fe00 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1fe10 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1fe20 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65  em1.n)==(unsigne
1fe30 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1fe40 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1fe50 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73  +mem1.n+1)==(uns
1fe60 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1fe70 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d         if( (d1+m
1fe80 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e  em1.n) > (unsign
1fe90 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1fea0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1feb0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1fec0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1fed0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1fee0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1fef0 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1ff00 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1ff10 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
1ff20 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
1ff30 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
1ff40 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1ff50 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1ff60 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1ff70 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
1ff80 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
1ff90 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
1ffa0 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
1ffb0 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
1ffc0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
1ffd0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d              &mem
1fff0 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
20000 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50  o->aColl[i], &pP
20010 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20  Key2->errCode.  
20020 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
20030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20040 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
20050 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d  IN(mem1.n, pRhs-
20060 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
20070 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
20080 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
20090 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
200a0 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
200b0 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d  = mem1.n - pRhs-
200c0 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  >n; .        }. 
200d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
200e0 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c    /* RHS is a bl
200f0 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ob */.    else i
20100 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
20110 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20   MEM_Blob ){.   
20120 20 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73     assert( (pRhs
20130 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
20140 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  ro)==0 || pRhs->
20150 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65  n==0 );.      ge
20160 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
20170 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
20180 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
20190 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
201a0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
201b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
201c0 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
201d0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
201e0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
201f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20200 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
20210 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
20220 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
20230 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
20240 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
20250 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
20260 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
20270 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
20280 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
20290 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
202a0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
202b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
202c0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
202d0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
202e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
202f0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
20300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
20310 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
20320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
20330 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
20340 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Zero ){.        
20350 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
20360 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61  ((const char*)&a
20370 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29  Key1[d1],nStr) )
20380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
20390 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
203a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
203b0 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70     rc = nStr - p
203c0 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Rhs->u.nZero;.  
203d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
203e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
203f0 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
20400 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
20410 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20420 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
20430 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
20440 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
20450 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
20460 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
20470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
20490 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
204a0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
204b0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
204c0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
204d0 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
204e0 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
204f0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
20500 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
20510 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
20520 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20530 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
20540 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52     assert( vdbeR
20550 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
20560 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
20570 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20  pPKey2, rc) );. 
20580 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
20590 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
205a0 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
205b0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
205c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
205d0 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70  ..    i++;.    p
205e0 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
205f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
20600 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
20610 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
20620 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
20630 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
20640 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
20650 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
20660 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
20670 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75  nField && d1<=(u
20680 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
20690 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
206a0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
206b0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
206c0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
206d0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
206e0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
206f0 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
20700 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
20710 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
20720 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
20730 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
20740 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
20750 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
20760 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
20770 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
20780 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
20790 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
207a0 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
207b0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
207c0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
207d0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
207e0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
207f0 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
20800 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
20810 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61  * value.  */.  a
20820 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
20830 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62  B .       || vdb
20840 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
20850 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
20860 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32  , pPKey2, pPKey2
20870 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20  ->default_rc) . 
20880 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66        || pKeyInf
20890 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
208a0 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79  led.  );.  pPKey
208b0 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
208c0 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
208d0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e  default_rc;.}.in
208e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
208f0 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
20900 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
20910 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
20920 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
20930 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
20940 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f  PKey2          /
20950 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
20960 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
20970 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20980 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
20990 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
209a0 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
209b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
209c0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
209d0 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
209e0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
209f0 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
20a00 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20a10 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e   of pPKey2 is an
20a20 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62   integer, and (b
20a30 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f  ) the .** size-o
20a40 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
20a50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
20a60 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
20a70 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a  ts in a single.*
20a80 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  * byte (i.e. is 
20a90 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a  less than 128)..
20aa0 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63  **.** To avoid c
20ab0 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75  oncerns about bu
20ac0 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20  ffer overreads, 
20ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
20ae0 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20  only used.** on 
20af0 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68  schemas where th
20b00 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20  e maximum valid 
20b10 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36  header size is 6
20b20 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e  3 bytes or less.
20b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
20b40 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20b50 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  Int(.  int nKey1
20b60 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
20b70 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
20b80 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20b90 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
20ba0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
20bb0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
20bc0 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e  8 *aKey = &((con
20bd0 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28  st u8*)pKey1)[*(
20be0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20  const u8*)pKey1 
20bf0 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73  & 0x3F];.  int s
20c00 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63  erial_type = ((c
20c10 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
20c20 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  1];.  int res;. 
20c30 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b   u32 y;.  u64 x;
20c40 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20  .  i64 v;.  i64 
20c50 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65  lhs;..  vdbeAsse
20c60 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
20c70 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
20c80 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
20c90 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  KeyInfo);.  asse
20ca0 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31  rt( (*(u8*)pKey1
20cb0 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55  )<=0x3F || CORRU
20cc0 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63  PT_DB );.  switc
20cd0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
20ce0 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
20cf0 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
20d00 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20d10 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
20d20 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20d30 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20d40 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20d60 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
20d70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20d80 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57  /.      lhs = TW
20d90 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
20da0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20db0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
20dc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20dd0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
20de0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
20df0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
20e00 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  s = THREE_BYTE_I
20e10 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20e20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
20e30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20e40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
20e50 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
20e60 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
20e70 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
20e80 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
20e90 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34        lhs = (i64
20ea0 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
20eb0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20ec0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20ee0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
20ef0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20f00 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f  /.      lhs = FO
20f10 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
20f20 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
20f30 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
20f40 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20f50 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
20f60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20f70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
20f80 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  : { /* 8-byte si
20f90 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
20fa0 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42        x = FOUR_B
20fb0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
20fc0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
20fd0 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
20fe0 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
20ff0 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26    lhs = *(i64*)&
21000 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  x;.      testcas
21010 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
21020 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
21030 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20     case 8: .    
21040 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20    lhs = 0;.     
21050 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
21060 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   9:.      lhs = 
21070 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
21080 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
21090 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76  e could be remov
210a0 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ed without chang
210b0 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
210c0 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a  of running.    *
210d0 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63  * this code. Inc
210e0 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73  luding it causes
210f0 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65   gcc to generate
21100 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68   a faster switch
21110 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
21120 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61  nt (since the ra
21130 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61  nge of switch ta
21140 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73  rgets now starts
21150 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20   at zero and.   
21160 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75   ** is contiguou
21170 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  s) but does not 
21180 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63  cause any duplic
21190 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67  ate code to be g
211a0 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
211b0 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65  (as gcc is cleve
211c0 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62  r enough to comb
211d0 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65  ine the two like
211e0 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a   cases). Other .
211f0 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73      ** compilers
21200 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61   might be simila
21210 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65  r.  */ .    case
21220 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20   0: case 7:.    
21230 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21240 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21250 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
21260 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65  pPKey2);..    de
21270 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
21280 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
21290 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
212a0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
212b0 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70  2);.  }..  v = p
212c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
212d0 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20  .i;.  if( v>lhs 
212e0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
212f0 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65  ey2->r1;.  }else
21300 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20   if( v<lhs ){.  
21310 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21320 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r2;.  }else if( 
21330 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
21340 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
21350 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
21360 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
21370 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74  equal. Compare t
21380 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20  he trailing .   
21390 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a   ** fields.  */.
213a0 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
213b0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
213c0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
213d0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
213e0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
213f0 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
21400 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
21410 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
21420 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
21430 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
21440 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
21450 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
21460 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
21470 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
21480 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
21490 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71  ;.    pPKey2->eq
214a0 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Seen = 1;.  }.. 
214b0 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
214c0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
214d0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
214e0 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
214f0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
21500 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21510 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
21520 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
21530 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21540 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
21550 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
21560 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
21570 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
21580 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
21590 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
215a0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
215b0 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
215c0 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
215d0 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
215e0 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
215f0 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
21600 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
21610 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
21620 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
21630 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
21640 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
21650 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
21660 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
21670 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
21680 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
21690 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
216a0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
216b0 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
216c0 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
216d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
216e0 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
216f0 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  rt( pPKey2->aMem
21700 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  [0].flags & MEM_
21710 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73  Str );.  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 67 65 74  pKeyInfo);.  get
21760 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
21770 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
21780 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
21790 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65  ype<12 ){.    re
217a0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20  s = pPKey2->r1; 
217b0 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
217c0 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65  Key1) is a numbe
217d0 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20  r or a null */. 
217e0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
217f0 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
21800 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70   ){ .    res = p
21810 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20  PKey2->r2;      
21820 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
21830 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
21840 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
21850 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  Cmp;.    int nSt
21860 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72  r;.    int szHdr
21870 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20   = aKey1[0];..  
21880 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
21890 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
218a0 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
218b0 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
218c0 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
218d0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
218e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
218f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
21900 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69  ;    /* Corrupti
21910 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
21920 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65  nCmp = MIN( pPKe
21930 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e  y2->aMem[0].n, n
21940 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  Str );.    res =
21950 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73   memcmp(&aKey1[s
21960 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61  zHdr], pPKey2->a
21970 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b  Mem[0].z, nCmp);
21980 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ..    if( res==0
21990 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
219a0 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61  nStr - pPKey2->a
219b0 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20  Mem[0].n;.      
219c0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
219d0 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
219e0 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
219f0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71          res = sq
21a00 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21a10 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
21a20 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
21a30 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
21a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21a50 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21a60 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
21a70 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71        pPKey2->eq
21a80 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
21a90 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
21aa0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
21ab0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
21ac0 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
21ad0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
21ae0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
21af0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
21b00 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
21b10 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21b20 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
21b30 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
21b40 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
21b50 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
21b60 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
21b70 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
21b80 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
21b90 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
21ba0 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
21bb0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
21bc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21bd0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
21be0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
21bf0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
21c00 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
21c10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
21c20 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
21c30 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
21c40 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
21c50 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
21c60 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
21c70 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
21c80 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
21c90 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
21ca0 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
21cb0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
21cc0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
21cd0 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
21ce0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
21cf0 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
21d00 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
21d10 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
21d20 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
21d30 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
21d40 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
21d50 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
21d60 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
21d70 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
21d80 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
21d90 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
21da0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
21db0 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
21dc0 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
21dd0 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
21de0 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
21df0 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
21e00 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
21e10 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
21e20 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
21e30 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
21e40 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
21e50 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
21e60 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
21e70 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
21e80 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
21e90 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
21ea0 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
21eb0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
21ec0 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
21ed0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
21ee0 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
21ef0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
21f00 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
21f10 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
21f20 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
21f30 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
21f40 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
21f50 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
21f60 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
21f70 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
21f80 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
21f90 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
21fa0 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
21fb0 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
21fc0 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
21fd0 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
21fe0 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
21ff0 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
22000 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
22010 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  p->pKeyInfo->nAl
22020 6c 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20  lField<=13 ){.  
22030 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
22040 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
22050 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
22060 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
22070 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
22080 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
22090 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
220a0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
220b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
220c0 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
220d0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
220e0 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
220f0 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
22100 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
22110 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
22120 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
22130 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
22140 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
22150 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
22160 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
22170 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
22180 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
22190 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
221a0 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
221b0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
221c0 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
221d0 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
221e0 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
221f0 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
22200 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
22210 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
22220 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
22230 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
22240 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
22250 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
22260 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
22270 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
22280 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
22290 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
222a0 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
222b0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
222c0 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
222d0 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
222e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
222f0 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
22300 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
22310 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
22320 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
22330 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
22340 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
22350 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
22360 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
22370 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
22380 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
22390 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
223a0 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
223b0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
223c0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
223d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
223e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
223f0 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
22400 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
22410 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
22420 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
22430 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
22440 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
22450 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
22460 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
22470 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
22480 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
22490 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
224a0 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
224b0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
224c0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
224d0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
224e0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
224f0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
22500 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
22510 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
22520 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
22530 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
22540 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
22550 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
22560 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
22570 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
22580 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
22590 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
225a0 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
225b0 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
225c0 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
225d0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
225e0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
225f0 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
22600 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
22610 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
22620 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
22630 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
22640 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
22650 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
22660 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
22670 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
22680 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
22690 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
226a0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
226b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
226c0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
226d0 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
226e0 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20  nCellKey, &m);. 
226f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
22700 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
22710 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
22720 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
22730 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
22740 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
22750 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
22760 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
22770 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
22780 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
22790 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
227a0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
227b0 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
227c0 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
227d0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
227e0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
227f0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
22800 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
22810 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
22820 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
22830 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
22840 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
22850 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
22860 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
22870 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
22880 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
22890 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
228a0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
228b0 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
228c0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
228d0 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
228e0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
228f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22900 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
22910 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22920 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
22930 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22940 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
22950 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
22960 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22970 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
22980 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
22990 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
229a0 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
229b0 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
229c0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
229d0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
229e0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
229f0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
22a00 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20  s[typeRowid];.  
22a10 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
22a20 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
22a30 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
22a40 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
22a50 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
22a60 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
22a70 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
22a80 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
22a90 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
22aa0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
22ab0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
22ac0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
22ad0 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
22ae0 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
22af0 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
22b00 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
22b10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22b20 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
22b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22b40 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
22b50 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
22b60 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
22b70 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
22b80 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
22b90 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
22ba0 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
22bb0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22bc0 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
22bd0 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
22be0 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c  estcase( m.szMal
22bf0 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
22c00 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
22c10 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
22c20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22c30 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
22c40 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
22c50 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
22c60 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
22c70 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
22c80 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
22c90 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
22ca0 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
22cb0 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
22cc0 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
22cd0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
22ce0 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
22cf0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
22d00 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
22d10 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
22d20 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
22d30 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
22d40 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
22d50 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
22d60 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
22d70 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
22d80 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
22d90 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
22da0 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
22db0 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
22dc0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
22dd0 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
22de0 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
22df0 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
22e00 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
22e10 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
22e20 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
22e30 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
22e40 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
22e50 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
22e60 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
22e70 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
22e80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
22eb0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
22ec0 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ee0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
22ef0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
22f00 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22f10 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
22f20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
22f30 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
22f40 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
22f70 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
22f80 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
22f90 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
22fa0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
22fb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
22fc0 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
22fd0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
22fe0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
22ff0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e  );.  pCur = pC->
23000 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
23010 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23020 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
23030 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
23040 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
23050 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
23060 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  ur);.  /* nCellK
23070 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
23080 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
23090 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
230a0 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
230b0 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
230c0 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
230d0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
230e0 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
230f0 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
23100 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
23110 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
23120 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
23130 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
23140 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23150 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
23160 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
23170 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
23180 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
23190 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
231a0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
231b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
231c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
231d0 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  }.  *res = sqlit
231e0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
231f0 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  are(m.n, m.z, pU
23200 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69  npacked);.  sqli
23210 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
23220 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
23230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23240 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23250 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
23260 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
23270 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
23280 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
23290 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
232a0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
232b0 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
232c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
232d0 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
232e0 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
232f0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
23300 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
23310 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
23320 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
23330 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
23340 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
23350 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
23360 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
23370 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
23380 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
23390 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
233a0 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
233b0 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
233c0 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
233d0 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
233e0 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
233f0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
23400 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
23410 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
23420 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
23430 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
23440 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
23450 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
23460 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
23470 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
23480 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
23490 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
234a0 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
234b0 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
234c0 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
234d0 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
234e0 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
234f0 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
23500 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
23510 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
23520 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
23530 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
23540 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
23550 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
23560 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
23570 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
23580 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
23590 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
235a0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
235b0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
235c0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
235d0 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
235e0 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
235f0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
23600 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
23610 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
23620 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
23630 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
23640 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
23650 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
23660 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
23670 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
23680 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23690 74 68 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41  the SQLITE_PREPA
236a0 52 45 20 66 6c 61 67 73 20 66 6f 72 20 61 20 56  RE flags for a V
236b0 64 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  dbe..*/.u8 sqlit
236c0 65 33 56 64 62 65 50 72 65 70 61 72 65 46 6c 61  e3VdbePrepareFla
236d0 67 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  gs(Vdbe *v){.  r
236e0 65 74 75 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61  eturn v->prepFla
236f0 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
23700 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23710 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
23720 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
23730 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
23740 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
23750 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
23760 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
23770 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
23780 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
23790 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
237a0 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
237b0 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
237c0 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
237d0 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
237e0 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
237f0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
23800 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
23810 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
23820 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
23830 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
23840 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
23850 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
23860 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
23870 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
23880 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
23890 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
238a0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
238b0 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
238c0 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
238d0 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
238e0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ];.    assert( (
238f0 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  v->db->flags & S
23900 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47  QLITE_EnableQPSG
23910 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
23920 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
23930 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
23940 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
23950 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
23960 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
23970 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
23980 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
23990 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
239a0 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
239b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
239c0 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
239d0 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
239e0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
239f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
23a00 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
23a10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
23a20 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
23a30 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
23a40 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
23a50 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
23a60 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
23a70 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
23a80 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
23a90 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
23aa0 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
23ab0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
23ac0 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
23ad0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
23ae0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
23af0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
23b00 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
23b10 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
23b20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (v->db->flags & 
23b30 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
23b40 47 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  G)==0 );.  if( i
23b50 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76  Var>=32 ){.    v
23b60 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38  ->expmask |= 0x8
23b70 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65  0000000;.  }else
23b80 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
23b90 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
23ba0 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
23bb0 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 20 66  ./*.** Cause a f
23bc0 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77  unction to throw
23bd0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20   an error if it 
23be0 77 61 73 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50  was call from OP
23bf0 5f 50 75 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74  _PureFunc.** rat
23c00 68 65 72 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63  her than OP_Func
23c10 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50  tion..**.** OP_P
23c20 75 72 65 46 75 6e 63 20 6d 65 61 6e 73 20 74 68  ureFunc means th
23c30 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
23c40 6d 75 73 74 20 62 65 20 64 65 74 65 72 6d 69 6e  must be determin
23c50 69 73 74 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c  istic, and shoul
23c60 64 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 65 72  d.** throw an er
23c70 72 6f 72 20 69 66 20 69 74 20 69 73 20 67 69 76  ror if it is giv
23c80 65 6e 20 69 6e 70 75 74 73 20 74 68 61 74 20 77  en inputs that w
23c90 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e  ould make it non
23ca0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a  -deterministic..
23cb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23cc0 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 64 61  is invoked by da
23cd0 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e  te/time function
23ce0 73 20 74 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64  s that use non-d
23cf0 65 74 65 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20  eterministic.** 
23d00 66 65 61 74 75 72 65 73 20 73 75 63 68 20 61 73  features such as
23d10 20 27 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73   'now'..*/.int s
23d20 71 6c 69 74 65 33 4e 6f 74 50 75 72 65 46 75 6e  qlite3NotPureFun
23d30 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
23d40 74 20 2a 70 43 74 78 29 7b 0a 23 69 66 64 65 66  t *pCtx){.#ifdef
23d50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
23d60 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
23d70 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 3d  if( pCtx->pVdbe=
23d80 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23  =0 ) return 1;.#
23d90 65 6e 64 69 66 0a 20 20 69 66 28 20 70 43 74 78  endif.  if( pCtx
23da0 2d 3e 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74  ->pVdbe->aOp[pCt
23db0 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d  x->iOp].opcode==
23dc0 4f 50 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a 20  OP_PureFunc ){. 
23dd0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
23de0 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
23df0 20 20 20 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72        "non-deter
23e00 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
23e10 6e 20 69 6e 20 69 6e 64 65 78 20 65 78 70 72 65  n in index expre
23e20 73 73 69 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63  ssion or CHECK c
23e30 6f 6e 73 74 72 61 69 6e 74 22 2c 0a 20 20 20 20  onstraint",.    
23e40 20 20 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75     -1);.    retu
23e50 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
23e60 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 1;.}..#ifndef
23e70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
23e80 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
23e90 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
23ea0 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
23eb0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
23ec0 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
23ed0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
23ee0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
23ef0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
23f00 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
23f10 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
23f20 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
23f30 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
23f40 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
23f50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
23f60 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
23f70 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
23f80 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
23f90 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
23fa0 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
23fb0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
23fc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23fd0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
23fe0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
23ff0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
24000 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
24010 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
24020 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
24030 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
24040 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
24050 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
24060 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
24070 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
24080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
24090 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
240a0 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
240b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
240c0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
240d0 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
240e0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
240f0 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
24100 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
24110 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
24120 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
24130 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
24140 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
24150 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
24160 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
24170 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24180 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
24190 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
241a0 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
241b0 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
241c0 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
241d0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
241e0 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
241f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
24200 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
24210 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
24220 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52  Field, UnpackedR
24230 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
24240 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
24250 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24260 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
24270 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
24280 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20  &p->aMem[i];.   
24290 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61     if( pMem->zMa
242a0 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64  lloc ) sqlite3Vd
242b0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
242c0 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  m);.    }.    sq
242d0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
242e0 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , p);.  }.}.#end
242f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
24300 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
24310 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OK */..#ifdef SQ
24320 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
24330 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a  PDATE_HOOK./*.**
24340 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
24350 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20  update hook. If 
24360 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
24370 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d  E or DELETE pre-
24380 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20  update call,.** 
24390 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73  then cursor pass
243a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
243b0 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
243c0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
243d0 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65  w about.** to be
243e0 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
243f0 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69  ed. If the appli
24400 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  cation calls sql
24410 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f  ite3_preupdate_o
24420 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71  ld(),.** the req
24430 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c  uired value will
24440 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
24450 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
24460 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76   points to..*/.v
24470 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
24480 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20  reUpdateHook(.  
24490 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244b0 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61  /* Vdbe pre-upda
244c0 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te hook is invok
244d0 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43  ed by */.  VdbeC
244e0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
244f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
24500 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64  rsor to grab old
24510 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a  .* values from *
24520 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
24550 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
24560 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73  DELETE */.  cons
24570 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
24580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
24590 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
245a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245c0 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61    /* Modified ta
245d0 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65  ble */.  i64 iKe
245e0 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y1,             
245f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
24600 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f  ial key value */
24610 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24630 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
24640 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20  or new.* record 
24650 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
24660 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69  *db = v->db;.  i
24670 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55  64 iKey2;.  PreU
24680 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b  pdate preupdate;
24690 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
246a0 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tbl = pTab->zNam
246b0 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  e;.  static cons
246c0 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64  t u8 fakeSortOrd
246d0 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  er = 0;..  asser
246e0 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
246f0 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e==0 );.  memset
24700 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20  (&preupdate, 0, 
24710 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65  sizeof(PreUpdate
24720 29 29 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77  ));.  if( HasRow
24730 69 64 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20  id(pTab)==0 ){. 
24740 20 20 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32     iKey1 = iKey2
24750 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64   = 0;.    preupd
24760 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65  ate.pPk = sqlite
24770 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
24780 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
24790 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
247a0 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  ITE_UPDATE ){.  
247b0 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
247c0 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
247d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
247e0 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey2 = iKey1;. 
247f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
24800 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64  rt( pCsr->nField
24810 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20  ==pTab->nCol .  
24820 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e       || (pCsr->n
24830 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f  Field==pTab->nCo
24840 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54  l+1 && op==SQLIT
24850 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67  E_DELETE && iReg
24860 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72  ==-1).  );..  pr
24870 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20  eupdate.v = v;. 
24880 20 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20   preupdate.pCsr 
24890 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64  = pCsr;.  preupd
248a0 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ate.op = op;.  p
248b0 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67  reupdate.iNewReg
248c0 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70   = iReg;.  preup
248d0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20  date.keyinfo.db 
248e0 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74  = db;.  preupdat
248f0 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20  e.keyinfo.enc = 
24900 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70  ENC(db);.  preup
24910 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
24920 79 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  yField = pTab->n
24930 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
24940 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72  .keyinfo.aSortOr
24950 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  der = (u8*)&fake
24960 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
24970 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
24980 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
24990 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
249a0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61  .  preupdate.pTa
249b0 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d  b = pTab;..  db-
249c0 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
249d0 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
249e0 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
249f0 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
24a00 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
24a10 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
24a20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
24a30 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
24a40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24a50 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
24a60 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
24a70 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
24a80 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
24a90 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75  KeyField+1, preu
24aa0 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
24ab0 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
24ac0 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
24ad0 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46  te.keyinfo.nKeyF
24ae0 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74  ield+1, preupdat
24af0 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b  e.pNewUnpacked);
24b00 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65  .  if( preupdate
24b10 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  .aNew ){.    int
24b20 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
24b30 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b   i<pCsr->nField;
24b40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
24b50 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
24b60 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e  se(&preupdate.aN
24b70 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
24b80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
24b90 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  N(db, preupdate.
24ba0 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  aNew);.  }.}.#en
24bb0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
24bc0 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
24bd0 4f 4f 4b 20 2a 2f 0a                             OOK */.