/ Hex Artifact Content
Login

Artifact 40f4b3ca7e0b5328f72c7263aab49112e354ec6bdeb9f2aae8030bc029709306:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70   pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42  A->expmask;.  pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41  ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d  ->prepFlags;.  m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74  emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72  er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f  , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61  unter));.  pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f  ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20  es not grow too 
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e  large */.  if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69  New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20  _VDBE_OP] ){.   
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  (p->db);.    ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
15c0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
15d0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74  Op[i]);.    test
15e0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
15f0: 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t();.  }.#endif.
1600: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
1610: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
1620: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1630: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
1640: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1650: 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d  _COVERAGE.  pOp-
1660: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23  >iSrcLine = 0;.#
1670: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
1680: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1690: 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a  dbeAddOp0(Vdbe *
16a0: 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65  p, int op){.  re
16b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c  AddOp3(p, op, 0,
16d0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
16e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
1700: 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75   int p1){.  retu
1710: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1720: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1730: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
1740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56  ite3VdbeAddOp2(V
1750: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1760: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
1770: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1780: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1790: 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d  p, p1, p2, 0);.}
17a0: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
17b0: 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64  de for an uncond
17c0: 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20  itional jump to 
17d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73  instruction iDes
17e0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
17f0: 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70  VdbeGoto(Vdbe *p
1800: 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20  , int iDest){.  
1810: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1820: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47  beAddOp3(p, OP_G
1830: 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30  oto, 0, iDest, 0
1840: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  );.}../* Generat
1850: 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20  e code to cause 
1860: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20  the string zStr 
1870: 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74  to be loaded int
1880: 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44  o.** register iD
1890: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
18a0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
18b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
18c0: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
18d0: 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e  *zStr){.  return
18e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f0: 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(p, OP_String8
1900: 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a  , 0, iDest, 0, z
1910: 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str, 0);.}../*.*
1920: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1930: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
1940: 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74   multiple regist
1950: 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72  ers to string or
1960: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
1970: 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  tants.  The regi
1980: 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 68  sters begin with
1990: 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65   iDest and incre
19a0: 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c  ase consecutivel
19b0: 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74  y..** One regist
19c0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
19d0: 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61  d for each chara
19e0: 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b  cgter in zTypes[
19f0: 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20  ].  For each.** 
1a00: 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69 6e  "s" character in
1a10: 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72   zTypes[], the r
1a20: 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74 72  egister is a str
1a30: 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 6d  ing if the argum
1a40: 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55  ent is.** not NU
1a50: 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69  LL, or OP_Null i
1a60: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1a70: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20   null pointer.  
1a80: 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 61  For each "i" cha
1a90: 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79  racter.** in zTy
1aa0: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1ab0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1ac0: 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
1ad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1ae0: 6e 70 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73  nput string does
1af0: 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58   not end with "X
1b00: 22 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73  " then an OP_Res
1b10: 75 6c 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69  ultRow instructi
1b20: 6f 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  on.** is generat
1b30: 65 64 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ed for the value
1b40: 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76  s inserted..*/.v
1b50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
1b60: 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70  ultiLoad(Vdbe *p
1b70: 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e  , int iDest, con
1b80: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c  st char *zTypes,
1b90: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1ba0: 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   ap;.  int i;.  
1bb0: 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61  char c;.  va_sta
1bc0: 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a  rt(ap, zTypes);.
1bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
1be0: 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69  zTypes[i])!=0; i
1bf0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++){.    if( c==
1c00: 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  's' ){.      con
1c10: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f  st char *z = va_
1c20: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
1c30: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
1c40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1c50: 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20   z==0 ? OP_Null 
1c60: 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  : OP_String8, 0,
1c70: 20 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20   iDest+i, 0, z, 
1c80: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
1c90: 28 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  ( c=='i' ){.    
1ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb0: 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(p, OP_Intege
1cc0: 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  r, va_arg(ap, in
1cd0: 74 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20  t), iDest+i);.  
1ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
1cf0: 6f 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75  oto skip_op_resu
1d00: 6c 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d  ltrow;.    }.  }
1d10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d20: 64 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(p, OP_Resul
1d30: 74 52 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b  tRow, iDest, i);
1d40: 0a 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72  .skip_op_resultr
1d50: 6f 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  ow:.  va_end(ap)
1d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1d70: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1d80: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1d90: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1da0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1db0: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1dc0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1dd0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1de0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
1df0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
1e00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1e10: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
1e20: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
1e30: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
1e40: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e60: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1e70: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e90: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1eb0: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1ed0: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1ee0: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
1ef0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
1f00: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1f10: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1f20: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1f30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1f40: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1f50: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1f60: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1f70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1f80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1f90: 70 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  p4 value with a 
1fa0: 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50  P4_INT64 or.** P
1fb0: 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a  4_REAL type..*/.
1fc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1fd0: 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62  ddOp4Dup8(.  Vdb
1fe0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ff0: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
2000: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
2010: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2020: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2030: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
2040: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
2050: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
2060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2080: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
2090: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
20b0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
20c0: 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20  onst u8 *zP4,   
20d0: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
20e0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
20f0: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
2100: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
2110: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
2120: 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44  4copy = sqlite3D
2130: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c  bMallocRawNN(sql
2140: 69 74 65 33 56 64 62 65 44 62 28 70 29 2c 20 38  ite3VdbeDb(p), 8
2150: 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20  );.  if( p4copy 
2160: 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c  ) memcpy(p4copy,
2170: 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75   zP4, 8);.  retu
2180: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
2190: 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp4(p, op, p1, 
21a0: 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20  p2, p3, p4copy, 
21b0: 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e  p4type);.}..#ifn
21c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21d0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65  EXPLAIN./*.** Re
21e0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
21f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2200: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2210: 41 4e 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20  AN baseline..** 
2220: 30 20 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a  0 means "none"..
2230: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2240: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2250: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2260: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2270: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
2280: 72 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  rExplain==0 ) re
2290: 74 75 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20  turn 0;.  pOp = 
22a0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
22b0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c  pParse->addrExpl
22d0: 61 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ain);.  return p
22e0: 4f 70 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op->p2;.}../*.**
22f0: 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78   Add a new OP_Ex
2300: 70 6c 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  plain opcode..**
2310: 0a 2a 2a 20 49 66 20 74 68 65 20 62 50 75 73 68  .** If the bPush
2320: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
2330: 68 65 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70  hen make this op
2340: 63 6f 64 65 20 74 68 65 20 70 61 72 65 6e 74 20  code the parent 
2350: 66 6f 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  for.** subsequen
2360: 74 20 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c  t Explains until
2370: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
2380: 61 69 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c  ainPop() is call
2390: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
23a0: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50  te3VdbeExplain(P
23b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38  arse *pParse, u8
23c0: 20 62 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68   bPush, const ch
23d0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
23e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
23f0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2400: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20  char *zMsg;.    
2410: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f  Vdbe *v;.    va_
2420: 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74  list ap;.    int
2430: 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73   iThis;.    va_s
2440: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
2450: 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
2460: 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73  e3VMPrintf(pPars
2470: 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29  e->db, zFmt, ap)
2480: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
2490: 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  ;.    v = pParse
24a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68  ->pVdbe;.    iTh
24b0: 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  is = v->nOp;.   
24c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24d0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
24e0: 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d  , iThis, pParse-
24f0: 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c  >addrExplain, 0,
2500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2510: 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f         zMsg, P4_
2520: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66  DYNAMIC);.    if
2530: 28 20 62 50 75 73 68 29 20 70 50 61 72 73 65 2d  ( bPush) pParse-
2540: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69  >addrExplain = i
2550: 54 68 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  This;.  }.}../*.
2560: 2a 2a 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41  ** Pop the EXPLA
2570: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74  IN QUERY PLAN st
2580: 61 63 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a  ack one level..*
2590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25a0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72  beExplainPop(Par
25b0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
25c0: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
25d0: 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  in = sqlite3Vdbe
25e0: 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50  ExplainParent(pP
25f0: 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  arse);.}.#endif 
2600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
2610: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
2620: 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65   Add an OP_Parse
2630: 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20  Schema opcode.  
2640: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2650: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a  broken out from.
2660: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
2670: 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20  dOp4() since it 
2680: 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65  needs to also ne
2690: 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20  eds to mark all 
26a0: 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76  btrees.** as hav
26b0: 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a  ing been used..*
26c0: 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20  *.** The zWhere 
26d0: 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65  string must have
26e0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
26f0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
2700: 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  oc()..** This ro
2710: 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20  utine will take 
2720: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
2730: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
2740: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
2750: 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
2760: 68 65 6d 61 4f 70 28 50 61 72 73 65 20 2a 70 50  hemaOp(Parse *pP
2770: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c 20 63  arse, int iDb, c
2780: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
2790: 56 64 62 65 20 2a 70 20 3d 20 70 50 61 72 73 65  Vdbe *p = pParse
27a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6a  ->pVdbe;.  int j
27b0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d  ;.  sqlite3Schem
27c0: 61 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  aWritable(pParse
27d0: 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
27e0: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f  3VdbeAddOp4(p, O
27f0: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
2800: 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65 72 65  Db, 0, 0, zWhere
2810: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
2820: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64   for(j=0; j<p->d
2830: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c  b->nDb; j++) sql
2840: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
2850: 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(p, j);.}../*.*
2860: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2870: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2880: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e  e p4 value as an
2890: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74   integer..*/.int
28a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28b0: 70 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70  p4Int(.  Vdbe *p
28c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
28d0: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
28e0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
28f0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
2900: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
2910: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
2920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2930: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
2940: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2960: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
2970: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
2980: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
2990: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
29a0: 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  4              /
29b0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
29c0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   as an integer *
29d0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20  /.){.  int addr 
29e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
29f0: 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70  Op3(p, op, p1, p
2a00: 32 2c 20 70 33 29 3b 0a 20 20 69 66 28 20 70 2d  2, p3);.  if( p-
2a10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2a20: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  d==0 ){.    Vdbe
2a30: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
2a40: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70 4f 70  p[addr];.    pOp
2a50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
2a60: 54 33 32 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  T32;.    pOp->p4
2a70: 2e 69 20 3d 20 70 34 3b 0a 20 20 7d 0a 20 20 72  .i = p4;.  }.  r
2a80: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2a90: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 65 6e 64  * Insert the end
2aa0: 20 6f 66 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   of a co-routine
2ab0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2ac0: 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
2ad0: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 72 65  (Vdbe *v, int re
2ae0: 67 59 69 65 6c 64 29 7b 0a 20 20 73 71 6c 69 74  gYield){.  sqlit
2af0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2b00: 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
2b10: 20 72 65 67 59 69 65 6c 64 29 3b 0a 0a 20 20 2f   regYield);..  /
2b20: 2a 20 43 6c 65 61 72 20 74 68 65 20 74 65 6d 70  * Clear the temp
2b30: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 63  orary register c
2b40: 61 63 68 65 2c 20 74 68 65 72 65 62 79 20 65 6e  ache, thereby en
2b50: 73 75 72 69 6e 67 20 74 68 61 74 20 65 61 63 68  suring that each
2b60: 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  .  ** co-routine
2b70: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 69 6e 64   has its own ind
2b80: 65 70 65 6e 64 65 6e 74 20 73 65 74 20 6f 66 20  ependent set of 
2b90: 72 65 67 69 73 74 65 72 73 2c 20 62 65 63 61 75  registers, becau
2ba0: 73 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 0a 20  se co-routines. 
2bb0: 20 2a 2a 20 6d 69 67 68 74 20 65 78 70 65 63 74   ** might expect
2bc0: 20 74 68 65 69 72 20 72 65 67 69 73 74 65 72 73   their registers
2bd0: 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64   to be preserved
2be0: 20 61 63 72 6f 73 73 20 61 6e 20 4f 50 5f 59 69   across an OP_Yi
2bf0: 65 6c 64 2c 20 61 6e 64 0a 20 20 2a 2a 20 74 68  eld, and.  ** th
2c00: 61 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 70  at could cause p
2c10: 72 6f 62 6c 65 6d 73 20 69 66 20 74 77 6f 20 6f  roblems if two o
2c20: 72 20 6d 6f 72 65 20 63 6f 2d 72 6f 75 74 69 6e  r more co-routin
2c30: 65 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  es are using the
2c40: 20 73 61 6d 65 0a 20 20 2a 2a 20 74 65 6d 70 6f   same.  ** tempo
2c50: 72 61 72 79 20 72 65 67 69 73 74 65 72 2e 0a 20  rary register.. 
2c60: 20 2a 2f 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d   */.  v->pParse-
2c70: 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
2c80: 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e   v->pParse->nRan
2c90: 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  geReg = 0;.}../*
2ca0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
2cb0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
2cc0: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
2cd0: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
2ce0: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
2cf0: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
2d00: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
2d10: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
2d20: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
2d30: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
2d40: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
2d50: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
2d60: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
2d70: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
2d80: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
2d90: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
2da0: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
2db0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
2dc0: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
2dd0: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
2de0: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
2df0: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
2e00: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
2e10: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
2e20: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
2e30: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
2e40: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
2e50: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
2e60: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
2e70: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
2e80: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
2e90: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
2ea0: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
2eb0: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
2ec0: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
2ed0: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
2ee0: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
2ef0: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
2f00: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
2f10: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
2f20: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2f30: 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61 72  (Vdbe *v){.  Par
2f40: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
2f50: 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e  e;.  int i = p->
2f60: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65  nLabel++;.  asse
2f70: 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( v->magic==VD
2f80: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2f90: 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31  .  if( (i & (i-1
2fa0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ))==0 ){.    p->
2fb0: 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  aLabel = sqlite3
2fc0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
2fd0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  p->db, p->aLabel
2fe0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31            (i*2+1
3010: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  )*sizeof(p->aLab
3020: 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  el[0]));.  }.  i
3030: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
3040: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
3050: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
3060: 75 72 6e 20 41 44 44 52 28 69 29 3b 0a 7d 0a 0a  urn ADDR(i);.}..
3070: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
3080: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
3090: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
30a0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
30b0: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
30c0: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
30d0: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
30e0: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
30f0: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
3100: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
3110: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
3120: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3130: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
3140: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b  Vdbe *v, int x){
3150: 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d  .  Parse *p = v-
3160: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a  >pParse;.  int j
3170: 20 3d 20 41 44 44 52 28 78 29 3b 0a 20 20 61 73   = ADDR(x);.  as
3180: 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d  sert( v->magic==
3190: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
31a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 70  );.  assert( j<p
31b0: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73  ->nLabel );.  as
31c0: 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20 20  sert( j>=0 );.  
31d0: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
31e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
31f0: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e  EBUG.    if( p->
3200: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
3210: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
3220: 65 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  e ){.      print
3230: 66 28 22 52 45 53 4f 4c 56 45 20 4c 41 42 45 4c  f("RESOLVE LABEL
3240: 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 78 2c   %d to %d\n", x,
3250: 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 7d 0a   v->nOp);.    }.
3260: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
3270: 74 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 3d  t( p->aLabel[j]=
3280: 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 4c 61 62 65  =(-1) ); /* Labe
3290: 6c 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72  ls may only be r
32a0: 65 73 6f 6c 76 65 64 20 6f 6e 63 65 20 2a 2f 0a  esolved once */.
32b0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
32c0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d   = v->nOp;.  }.}
32d0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
32e0: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
32f0: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
3300: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
3310: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
3320: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
3330: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
3340: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  yOnce = 1;.}../*
3350: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
3360: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
3370: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75  n only be run mu
3380: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f  ltiple times..*/
3390: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
33a0: 65 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a  eReusable(Vdbe *
33b0: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
33c0: 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  Once = 0;.}..#if
33d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
33e0: 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72   /* sqlite3Asser
33f0: 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69  tMayAbort() logi
3400: 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c */../*.** The 
3410: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61  following type a
3420: 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  nd function are 
3430: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
3440: 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f  through all opco
3450: 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65  des.** in a Vdbe
3460: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e   main program an
3470: 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75  d each of the su
3480: 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67  b-programs (trig
3490: 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a  gers) it may .**
34a0: 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79   invoke directly
34b0: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   or indirectly. 
34c0: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  It should be use
34d0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
34e0: 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a  .**   Op *pOp;.*
34f0: 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  *   VdbeOpIter s
3500: 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65  Iter;.**.**   me
3510: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3520: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3530: 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76  **   sIter.v = v
3540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
3560: 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62  v is of type Vdb
3570: 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20  e* .**   while( 
3580: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
3590: 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a  t(&sIter)) ){.**
35a0: 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74       // Do somet
35b0: 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a  hing with pOp.**
35c0: 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65     }.**   sqlite
35d0: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
35e0: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20  Iter.apSub);.** 
35f0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3600: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64  ct VdbeOpIter Vd
3610: 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74  beOpIter;.struct
3620: 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20   VdbeOpIter {.  
3630: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
3640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
3650: 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  be to iterate th
3660: 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65  rough the opcode
3670: 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f  s of */.  SubPro
3680: 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20  gram **apSub;   
3690: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
36a0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
36b0: 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20    int nSub;     
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36d0: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
36e0: 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20  s in apSub */.  
36f0: 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20  int iAddr;      
3700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
3710: 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e  dress of next in
3720: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74  struction to ret
3730: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  urn */.  int iSu
3740: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3750: 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20      /* 0 = main 
3760: 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72  program, 1 = fir
3770: 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65  st sub-program e
3780: 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  tc. */.};.static
3790: 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28   Op *opIterNext(
37a0: 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a  VdbeOpIter *p){.
37b0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76    Vdbe *v = p->v
37c0: 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30  ;.  Op *pRet = 0
37d0: 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69  ;.  Op *aOp;.  i
37e0: 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70  nt nOp;..  if( p
37f0: 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20  ->iSub<=p->nSub 
3800: 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ){..    if( p->i
3810: 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sub==0 ){.      
3820: 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20  aOp = v->aOp;.  
3830: 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70      nOp = v->nOp
3840: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3850: 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75     aOp = p->apSu
3860: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f  b[p->iSub-1]->aO
3870: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70  p;.      nOp = p
3880: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
3890: 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  1]->nOp;.    }. 
38a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41     assert( p->iA
38b0: 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20  ddr<nOp );..    
38c0: 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69  pRet = &aOp[p->i
38d0: 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41  Addr];.    p->iA
38e0: 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  ddr++;.    if( p
38f0: 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a  ->iAddr==nOp ){.
3900: 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b        p->iSub++;
3910: 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20  .      p->iAddr 
3920: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
3930: 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79    if( pRet->p4ty
3940: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
3950: 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  M ){.      int n
3960: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b  Byte = (p->nSub+
3970: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
3980: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e  gram*);.      in
3990: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
39a0: 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a  =0; j<p->nSub; j
39b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
39c0: 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52   p->apSub[j]==pR
39d0: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  et->p4.pProgram 
39e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
39f0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d  .      if( j==p-
3a00: 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  >nSub ){.       
3a10: 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69   p->apSub = sqli
3a20: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
3a30: 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53  ee(v->db, p->apS
3a40: 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  ub, nByte);.    
3a50: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75      if( !p->apSu
3a60: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  b ){.          p
3a70: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Ret = 0;.       
3a80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3a90: 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53    p->apSub[p->nS
3aa0: 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34  ub++] = pRet->p4
3ab0: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
3ac0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3ad0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3ae0: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
3af0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f  Check if the pro
3b00: 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74  gram stored in t
3b10: 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64  he VM associated
3b20: 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79   with pParse may
3b30: 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f  .** throw an ABO
3b40: 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61  RT exception (ca
3b50: 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  using the statem
3b60: 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74  ent, but not ent
3b70: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ire transaction.
3b80: 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ** to be rolled 
3b90: 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64  back). This cond
3ba0: 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ition is true if
3bb0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
3bc0: 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d  m or any.** sub-
3bd0: 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e  programs contain
3be0: 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  s any of the fol
3bf0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
3c00: 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20  *  OP_Halt with 
3c10: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
3c20: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
3c30: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
3c40: 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68  _HaltIfNull with
3c50: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
3c60: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
3c70: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
3c80: 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a  P_Destroy.**   *
3c90: 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20    OP_VUpdate.** 
3ca0: 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a    *  OP_VRename.
3cb0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75  **   *  OP_FkCou
3cc0: 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20  nter with P2==0 
3cd0: 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
3ce0: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
3cf0: 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72  t).**   *  OP_Cr
3d00: 65 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f  eateBtree/BTREE_
3d10: 49 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e  INTKEY and OP_In
3d20: 69 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20  itCoroutine .** 
3d30: 20 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45       (for CREATE
3d40: 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54   TABLE AS SELECT
3d50: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...).**.** Then
3d60: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
3d70: 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d  value of Parse.m
3d80: 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20  ayAbort is true 
3d90: 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d  if an.** ABORT m
3da0: 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72  ay be thrown, or
3db0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
3dc0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  . Return true if
3dd0: 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63   it does.** matc
3de0: 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  h, or false othe
3df0: 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63  rwise. This func
3e00: 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64  tion is intended
3e10: 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a   to be used as.*
3e20: 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  * part of an ass
3e30: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ert statement in
3e40: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53   the compiler. S
3e50: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
3e60: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3e70: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3e80: 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64  bort(pParse->pVd
3e90: 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41  be, pParse->mayA
3ea0: 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20  bort) );.*/.int 
3eb0: 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72  sqlite3VdbeAsser
3ec0: 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a  tMayAbort(Vdbe *
3ed0: 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29  v, int mayAbort)
3ee0: 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74  {.  int hasAbort
3ef0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46   = 0;.  int hasF
3f00: 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  kCounter = 0;.  
3f10: 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62  int hasCreateTab
3f20: 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  le = 0;.  int ha
3f30: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
3f40: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
3f50: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
3f60: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
3f70: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
3f80: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
3f90: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
3fa0: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
3fb0: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
3fc0: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
3fd0: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
3fe0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
3ff0: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
4000: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
4010: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
4020: 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28  ename .     || (
4030: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
4040: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
4050: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
4060: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
4070: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
4080: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
4090: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
40a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
40b0: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
40c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
40d0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
40e0: 43 72 65 61 74 65 42 74 72 65 65 20 26 26 20 70  CreateBtree && p
40f0: 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e  Op->p3==BTREE_IN
4100: 54 4b 45 59 20 29 20 68 61 73 43 72 65 61 74 65  TKEY ) hasCreate
4110: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
4120: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
4130: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
4140: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
4150: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
4160: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
4170: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
4180: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
4190: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
41a0: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
41b0: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
41c0: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
41d0: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
41e0: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
41f0: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
4200: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
4210: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
4220: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
4230: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
4240: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
4250: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
4260: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
4270: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
4280: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
4290: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
42a0: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
42b0: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
42c0: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
42d0: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
42e0: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
42f0: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
4300: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
4310: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
4320: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
4330: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
4340: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4350: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
4360: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
4370: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
4380: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
4390: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
43a0: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
43b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
43c0: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
43d0: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
43e0: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
43f0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
4400: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e  E_DEBUG./*.** In
4410: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69  crement the nWri
4420: 74 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68  te counter in th
4430: 65 20 56 44 42 45 20 69 66 20 74 68 65 20 63 75  e VDBE if the cu
4440: 72 73 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a  rsor is not an.*
4450: 2a 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  * ephemeral curs
4460: 6f 72 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75  or, or if the cu
4470: 72 73 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73  rsor argument is
4480: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   NULL..*/.void s
4490: 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72  qlite3VdbeIncrWr
44a0: 69 74 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20  iteCounter(Vdbe 
44b0: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
44c0: 70 43 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30  pC){.  if( pC==0
44d0: 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72  .   || (pC->eCur
44e0: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f  Type!=CURTYPE_SO
44f0: 52 54 45 52 0a 20 20 20 20 20 20 20 26 26 20 70  RTER.       && p
4500: 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  C->eCurType!=CUR
4510: 54 59 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20  TYPE_PSEUDO.    
4520: 20 20 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68     && !pC->isEph
4530: 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20  emeral).  ){.   
4540: 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20   p->nWrite++;.  
4550: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
4560: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4570: 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20  /*.** Assert if 
4580: 61 6e 20 41 62 6f 72 74 20 61 74 20 74 68 69 73  an Abort at this
4590: 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d   point in time m
45a0: 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
45b0: 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61   corrupt.** data
45c0: 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
45d0: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41  lite3VdbeAssertA
45e0: 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70  bortable(Vdbe *p
45f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4600: 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e  nWrite==0 || p->
4610: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
4620: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
4630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4640: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
4650: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
4660: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
4670: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
4680: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
4690: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
46a0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
46b0: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
46c0: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
46d0: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
46e0: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
46f0: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
4700: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
4710: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
4720: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
4730: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
4740: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
4750: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
4760: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
4770: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
4780: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
4790: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
47a0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
47b0: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
47c0: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
47d0: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
47e0: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
47f0: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
4800: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
4810: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
4820: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
4830: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
4840: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
4850: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
4860: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
4870: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
4880: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
4890: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
48a0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
48b0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
48c0: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
48d0: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
48e0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
48f0: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
4900: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
4910: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
4920: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
4930: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
4940: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
4950: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
4960: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
4970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
4980: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
4990: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
49a0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
49b0: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
49c0: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
49d0: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
49e0: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
49f0: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
4a00: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
4a10: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
4a20: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
4a30: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
4a40: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
4a50: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
4a60: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
4a70: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
4a80: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
4a90: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
4aa0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
4ab0: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
4ac0: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
4ad0: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
4ae0: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
4af0: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
4b00: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
4b10: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
4b20: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
4b30: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
4b40: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
4b50: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
4b60: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
4b70: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
4b80: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
4b90: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
4ba0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
4bb0: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
4bc0: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
4bd0: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
4be0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
4bf0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
4c00: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
4c10: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
4c20: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
4c30: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
4c40: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
4c50: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
4c60: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
4c70: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
4c80: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
4c90: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
4ca0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4cb0: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
4cc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
4cd0: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
4ce0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
4cf0: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
4d00: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
4d10: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
4d20: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
4d30: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
4d40: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
4d50: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
4d60: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
4d70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
4d80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4d90: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
4da0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
4db0: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
4dc0: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
4dd0: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4de0: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
4df0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
4e00: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
4e10: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
4e20: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
4e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4e40: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
4e50: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
4e60: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
4e70: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
4e80: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
4e90: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
4ea0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
4eb0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
4ec0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
4ed0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
4ee0: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
4ef0: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
4f00: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
4f10: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
4f20: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
4f30: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
4f40: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
4f50: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
4f60: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
4f70: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
4f80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4f90: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
4fa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4fc0: 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a  case OP_Prev: {.
4fd0: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
4fe0: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
4ff0: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
5000: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  s;.          pOp
5010: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
5020: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20  VANCE;.         
5030: 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e   /* The code gen
5040: 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64  erator never cod
5050: 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  es any of these 
5060: 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d  opcodes as a jum
5070: 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  p.          ** t
5080: 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79  o a label.  They
5090: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65   are always code
50a0: 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b  d as a jump back
50b0: 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20  wards to a .    
50c0: 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61        ** known a
50d0: 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ddress */.      
50e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
50f0: 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  >p2>=0 );.      
5100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5110: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
5120: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5130: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61  TABLE.        ca
5140: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
5150: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5160: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
5170: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
5180: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
5190: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
51a0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
51b0: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
51c0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
51d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
51e0: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d  pOp - p->aOp) >=
51f0: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3 );.          
5200: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
5210: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
5220: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er );.          
5230: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
5240: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e            if( n>
5250: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5260: 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  rgs = n;.       
5270: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5280: 67 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61  gh into the defa
5290: 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ult case */.    
52a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
52b0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
52c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
52d0: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
52e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b         /* The mk
52f0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69  opcodeh.tcl scri
5300: 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67  pt has so arrang
5310: 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74  ed things that t
5320: 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  he only.        
5330: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
5340: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
5350: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5360: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
5370: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  teed to.        
5380: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
5390: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
53a0: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
53b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
53c0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
53d0: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
53e0: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
53f0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
5400: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28     assert( ADDR(
5410: 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d  pOp->p2)<pParse-
5420: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
5430: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
5440: 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70   aLabel[ADDR(pOp
5450: 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20 20  ->p2)];.        
5460: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
5470: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
5490: 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63  The mkopcodeh.tc
54a0: 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20  l script has so 
54b0: 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20  arranged things 
54c0: 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20  that the only.  
54d0: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
54e0: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
54f0: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5500: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
5510: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  teed to.      **
5520: 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69   have non-negati
5530: 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32  ve values for P2
5540: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
5550: 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  t( (sqlite3Opcod
5560: 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f  eProperty[pOp->o
5570: 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d  pcode]&OPFLG_JUM
5580: 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32  P)==0 || pOp->p2
5590: 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >=0);.    }.    
55a0: 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20  if( pOp==p->aOp 
55b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70  ) break;.    pOp
55c0: 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  --;.  }.  sqlite
55d0: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
55e0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a  Parse->aLabel);.
55f0: 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c    pParse->aLabel
5600: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
5610: 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70  nLabel = 0;.  *p
5620: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
5630: 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74  axArgs;.  assert
5640: 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d  ( p->bIsReader!=
5650: 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65  0 || DbMaskAllZe
5660: 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  ro(p->btreeMask)
5670: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
5680: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
5690: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
56a0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
56b0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
56c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
56d0: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
56e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
56f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5700: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
5710: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
5720: 20 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20   Verify that at 
5730: 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73  least N opcode s
5740: 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62  lots are availab
5750: 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a  le in p without.
5760: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c  ** having to mal
5770: 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61  loc for more spa
5780: 63 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20  ce (except when 
5790: 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a  compiled using.*
57a0: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  * SQLITE_TEST_RE
57b0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20  ALLOC_STRESS).  
57c0: 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69  This interface i
57d0: 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
57e0: 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69  sting.** to veri
57f0: 66 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  fy that certain 
5800: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
5810: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20  VdbeAddOpList() 
5820: 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69  can never.** fai
5830: 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66  l due to a OOM f
5840: 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74  ault and hence t
5850: 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76  hat the return v
5860: 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  alue from.** sql
5870: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
5880: 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  t() will always 
5890: 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a  be non-NULL..*/.
58a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
58b0: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
58c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
58d0: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
58e0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
58f0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
5900: 52 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70  Required(Vdbe *p
5910: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
5920: 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c  rt( p->nOp + N <
5930: 3d 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  = p->pParse->nOp
5940: 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69  Alloc );.}.#endi
5950: 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  f../*.** Verify 
5960: 74 68 61 74 20 74 68 65 20 56 4d 20 70 61 73 73  that the VM pass
5970: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
5980: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
5990: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f   contain.** an O
59a0: 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
59b0: 64 65 2e 20 46 61 69 6c 20 61 6e 20 61 73 73 65  de. Fail an asse
59c0: 72 74 28 29 20 69 66 20 69 74 20 64 6f 65 73 2e  rt() if it does.
59d0: 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a   This is used.**
59e0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 72 61 67   by code in prag
59f0: 6d 61 2e 63 20 74 6f 20 65 6e 73 75 72 65 20 74  ma.c to ensure t
5a00: 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  hat the implemen
5a10: 74 61 74 69 6f 6e 20 6f 66 20 63 65 72 74 61 69  tation of certai
5a20: 6e 0a 2a 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d  n.** pragmas com
5a30: 70 6f 72 74 73 20 77 69 74 68 20 74 68 65 20 66  ports with the f
5a40: 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20 69  lags specified i
5a50: 6e 20 74 68 65 20 6d 6b 70 72 61 67 6d 61 74 61  n the mkpragmata
5a60: 62 2e 74 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e  b.tcl.** script.
5a70: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
5a80: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
5a90: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5aa0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
5ab0: 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74  RESS).void sqlit
5ac0: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65  e3VdbeVerifyNoRe
5ad0: 73 75 6c 74 52 6f 77 28 56 64 62 65 20 2a 70 29  sultRow(Vdbe *p)
5ae0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
5af0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
5b00: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
5b10: 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  ( p->aOp[i].opco
5b20: 64 65 21 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77  de!=OP_ResultRow
5b30: 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   );.  }.}.#endif
5b40: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5b50: 20 63 6f 64 65 20 28 61 20 73 69 6e 67 6c 65 20   code (a single 
5b60: 4f 50 5f 41 62 6f 72 74 61 62 6c 65 20 6f 70 63  OP_Abortable opc
5b70: 6f 64 65 29 20 74 68 61 74 20 77 69 6c 6c 0a 2a  ode) that will.*
5b80: 2a 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  * verify that th
5b90: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 63  e VDBE program c
5ba0: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 20 41  an safely call A
5bb0: 62 6f 72 74 20 69 6e 20 74 68 65 20 63 75 72 72  bort in the curr
5bc0: 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a  ent.** context..
5bd0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
5be0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69  QLITE_DEBUG).voi
5bf0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72  d sqlite3VdbeVer
5c00: 69 66 79 41 62 6f 72 74 61 62 6c 65 28 56 64 62  ifyAbortable(Vdb
5c10: 65 20 2a 70 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  e *p, int onErro
5c20: 72 29 7b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f  r){.  if( onErro
5c30: 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 20 73 71  r==OE_Abort ) sq
5c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
5c50: 70 2c 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 29  p, OP_Abortable)
5c60: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5c70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5c80: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
5c90: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
5ca0: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
5cb0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
5cc0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
5cd0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5ce0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
5cf0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
5d00: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
5d10: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
5d20: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
5d30: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
5d40: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
5d50: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
5d60: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
5d70: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
5d80: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
5d90: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
5da0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
5db0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
5dc0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
5dd0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
5de0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
5df0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
5e00: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
5e10: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
5e20: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
5e30: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
5e40: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
5e50: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
5e60: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
5e70: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
5e80: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
5e90: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
5ea0: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
5eb0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
5ec0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
5ed0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
5ee0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
5ef0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
5f00: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
5f10: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
5f20: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
5f30: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
5f40: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
5f50: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
5f60: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
5f70: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
5f80: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
5f90: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
5fa0: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
5fb0: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
5fc0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
5fd0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
5fe0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61  stack.  Return a
5ff0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
6000: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
6010: 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  on inserted..**.
6020: 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61  ** Non-zero P2 a
6030: 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70  rguments to jump
6040: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
6050: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
6060: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74  adjusted.** so t
6070: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72  hat the jump tar
6080: 67 65 74 20 69 73 20 72 65 6c 61 74 69 76 65 20  get is relative 
6090: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  to the first ope
60a0: 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e  ration inserted.
60b0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
60c0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
60d0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20   /* Add opcodes 
6100: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
6110: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
6120: 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20  nt nOp,         
6130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6140: 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73  umber of opcodes
6150: 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62   to add */.  Vdb
6160: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
6170: 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Op,       /* The
6180: 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61   opcodes to be a
6190: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  dded */.  int iL
61a0: 69 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20  ineno           
61b0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
61c0: 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65  -file line numbe
61d0: 72 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64  r of first opcod
61e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
61f0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c  .  VdbeOp *pOut,
6200: 20 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65   *pFirst;.  asse
6210: 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61  rt( nOp>0 );.  a
6220: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
6230: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
6240: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
6250: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72   + nOp > p->pPar
6260: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20  se->nOpAlloc && 
6270: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e  growOpArray(p, n
6280: 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Op) ){.    retur
6290: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73  n 0;.  }.  pFirs
62a0: 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  t = pOut = &p->a
62b0: 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f  Op[p->nOp];.  fo
62c0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
62d0: 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b  +, aOp++, pOut++
62e0: 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  ){.    pOut->opc
62f0: 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64  ode = aOp->opcod
6300: 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  e;.    pOut->p1 
6310: 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70  = aOp->p1;.    p
6320: 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70  Out->p2 = aOp->p
6330: 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  2;.    assert( a
6340: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
6350: 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63   if( (sqlite3Opc
6360: 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d  odeProperty[aOp-
6370: 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47  >opcode] & OPFLG
6380: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70  _JUMP)!=0 && aOp
6390: 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20  ->p2>0 ){.      
63a0: 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e  pOut->p2 += p->n
63b0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  Op;.    }.    pO
63c0: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
63d0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
63e0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
63f0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
6400: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
6410: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
6420: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
6430: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
6440: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
6450: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
6460: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
6470: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
6480: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
6490: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
64a0: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
64b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
64c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
64d0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
64e0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
64f0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
6500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
6510: 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70  ntOp(0, i+p->nOp
6520: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e  , &p->aOp[i+p->n
6530: 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Op]);.    }.#end
6540: 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20  if.  }.  p->nOp 
6550: 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e  += nOp;.  return
6560: 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20   pFirst;.}..#if 
6570: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
6580: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
6590: 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64  TATUS)./*.** Add
65a0: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
65b0: 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65   array of counte
65c0: 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71  rs managed by sq
65d0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
65e0: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  tatus()..*/.void
65f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e   sqlite3VdbeScan
6600: 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a  Status(.  Vdbe *
6610: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20            /* VM 
6630: 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75  to add scanstatu
6640: 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  s() to */.  int 
6650: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20  addrExplain,    
6660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6670: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70  ddress of OP_Exp
6680: 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20  lain (or 0) */. 
6690: 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20   int addrLoop,  
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66b0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c   /* Address of l
66c0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a  oop counter */ .
66d0: 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c    int addrVisit,
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
6700: 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75  rows visited cou
6710: 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  nter */.  LogEst
6720: 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20   nEst,          
6730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
6740: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
6750: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
6760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
6770: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
6780: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
6790: 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e  le or index bein
67a0: 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a  g scanned */.){.
67b0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
67c0: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
67d0: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
67e0: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
67f0: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
6800: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
6810: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
6820: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
6830: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
6840: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
6850: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
6860: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
6870: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
6880: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
6890: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
68a0: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
68b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
68c0: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
68d0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
68e0: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
68f0: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
6900: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
6910: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
6920: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
6930: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
6940: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
6950: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
6960: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
6970: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
6980: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
6990: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
69a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
69b0: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
69c0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
69d0: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
69e0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
69f0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
6a00: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
6a10: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
6a20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
6a30: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
6a40: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
6a50: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
6a60: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
6a70: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
6a80: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
6a90: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
6aa0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
6ab0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
6ac0: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
6ad0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
6ae0: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
6af0: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
6b00: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
6b10: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
6b20: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
6b30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6b40: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
6b50: 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73  p, u16 p5){.  as
6b60: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
6b70: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
6b80: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
6b90: 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70  ->nOp>0 ) p->aOp
6ba0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
6bb0: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  p5;.}../*.** Cha
6bc0: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
6bd0: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
6be0: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
6bf0: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
6c00: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
6c10: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
6c20: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
6c30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6c40: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
6c50: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
6c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6c70: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
6c80: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
6c90: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
6ca0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
6cb0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
6cc0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
6cd0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
6ce0: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
6cf0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
6d00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6d10: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
6d20: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
6d30: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
6d40: 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d  f){.  if( (pDef-
6d50: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
6d60: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
6d70: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6d80: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44  3DbFreeNN(db, pD
6d90: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
6da0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
6db0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
6dc0: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
6dd0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
6de0: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
6df0: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
6e00: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
6e10: 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73  void freeP4Mem(s
6e20: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20  qlite3 *db, Mem 
6e30: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  *p){.  if( p->sz
6e40: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
6e50: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
6e60: 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65  alloc);.  sqlite
6e70: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
6e80: 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54  ;.}.static SQLIT
6e90: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
6ea0: 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71  freeP4FuncCtx(sq
6eb0: 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74  lite3 *db, sqlit
6ec0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a  e3_context *p){.
6ed0: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
6ee0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70  unction(db, p->p
6ef0: 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44  Func);. sqlite3D
6f00: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
6f10: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
6f20: 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62  eeP4(sqlite3 *db
6f30: 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f  , int p4type, vo
6f40: 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72  id *p4){.  asser
6f50: 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63  t( db );.  switc
6f60: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
6f70: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
6f80: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  : {.      freeP4
6f90: 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c  FuncCtx(db, (sql
6fa0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
6fb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6fc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6fd0: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65  4_REAL:.    case
6fe0: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63   P4_INT64:.    c
6ff0: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
7000: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42      case P4_DYNB
7010: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34  LOB:.    case P4
7020: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
7030: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7040: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
7050: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7060: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
7070: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7080: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7090: 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 ) sqlite3KeyIn
70a0: 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f  foUnref((KeyInfo
70b0: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
70c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
70d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
70e0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
70f0: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
7100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7110: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
7120: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  r*)p4);.      br
7130: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7140: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  f.    case P4_FU
7150: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 66  NCDEF: {.      f
7160: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
7170: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
7180: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  f*)p4);.      br
7190: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
71a0: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
71b0: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
71c0: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20  tesFreed==0 ){. 
71d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
71e0: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
71f0: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
7200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7210: 20 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c 20    freeP4Mem(db, 
7220: 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20  (Mem*)p4);.     
7230: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7240: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7250: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
7260: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
7270: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
7280: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
7290: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
72a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
72b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
72c0: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
72d0: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
72e0: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
72f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
7300: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
7310: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
7320: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
7330: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
7340: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
7350: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
7360: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
7370: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
7380: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
7390: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
73a0: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
73b0: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
73c0: 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f  =&aOp[nOp-1]; pO
73d0: 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a  p>=aOp; pOp--){.
73e0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
73f0: 34 74 79 70 65 20 3c 3d 20 50 34 5f 46 52 45 45  4type <= P4_FREE
7400: 5f 49 46 5f 4c 45 20 29 20 66 72 65 65 50 34 28  _IF_LE ) freeP4(
7410: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
7420: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
7430: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7440: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
7450: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
7460: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
7470: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
7480: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20  f     .    }.   
7490: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
74a0: 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d  (db, aOp);.  }.}
74b0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
74c0: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
74d0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
74e0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
74f0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
7500: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
7510: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
7520: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
7530: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
7540: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
7550: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
7560: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
7570: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
7580: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
7590: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
75a0: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
75b0: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
75c0: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
75d0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
75e0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
75f0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7600: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
7610: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69  nto OP_Noop.*/.i
7620: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
7630: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
7640: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
7650: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
7660: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
7670: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
7680: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   0;.  assert( ad
7690: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
76a0: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20  >nOp );.  pOp = 
76b0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
76c0: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
76d0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
76e0: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
76f0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
7700: 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ED;.  pOp->p4.z 
7710: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  = 0;.  pOp->opco
7720: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
7730: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
7740: 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f  ** If the last o
7750: 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e  pcode is "op" an
7760: 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75  d it is not a ju
7770: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a  mp destination,.
7780: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69  ** then remove i
7790: 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
77a0: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
77b0: 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d  n opcode was rem
77c0: 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
77d0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
77e0: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
77f0: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
7800: 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e   p->nOp>0 && p->
7810: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70  aOp[p->nOp-1].op
7820: 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20  code==op ){.    
7830: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
7840: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70  beChangeToNoop(p
7850: 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d  , p->nOp-1);.  }
7860: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7870: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7880: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
7890: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
78a0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
78b0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
78c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
78d0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
78e0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
78f0: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
7900: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
7910: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
7920: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
7930: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
7940: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
7950: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
7960: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
7970: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
7980: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
7990: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
79a0: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
79b0: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
79c0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
79d0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
79e0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
79f0: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
7a00: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
7a10: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
7a20: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
7a30: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
7a40: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
7a50: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
7a60: 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f  of zP4..** .** O
7a70: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
7a80: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
7a90: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
7aa0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
7ab0: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
7ac0: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
7ad0: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
7ae0: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
7af0: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
7b00: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
7b10: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
7b20: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
7b30: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
7b40: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
7b50: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
7b60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
7b70: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
7b80: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
7b90: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49   void SQLITE_NOI
7ba0: 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67 65  NLINE vdbeChange
7bb0: 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a  P4Full(.  Vdbe *
7bc0: 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20  p,.  Op *pOp,.  
7bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
7be0: 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66  .  int n.){.  if
7bf0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
7c00: 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64  .    freeP4(p->d
7c10: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
7c20: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
7c30: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b  pOp->p4type = 0;
7c40: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
7c50: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c   0;.  }.  if( n<
7c60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7c70: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
7c80: 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61  (int)(pOp - p->a
7c90: 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  Op), zP4, n);.  
7ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
7cb0: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
7cc0: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
7cd0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
7ce0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
7cf0: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
7d00: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7d10: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
7d20: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
7d30: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
7d40: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
7d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
7d60: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
7d70: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
7d80: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
7d90: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
7da0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
7db0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
7dc0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
7dd0: 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c  ert( p->aOp!=0 |
7de0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
7df0: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
7e00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
7e10: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54      if( n!=P4_VT
7e20: 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  AB ) freeP4(db, 
7e30: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
7e40: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72 65  **)&zP4);.    re
7e50: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
7e60: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
7e70: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
7e80: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
7e90: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
7ea0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
7eb0: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
7ec0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
7ed0: 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34   n>=0 || pOp->p4
7ee0: 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62 65  type ){.    vdbe
7ef0: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20  ChangeP4Full(p, 
7f00: 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  pOp, zP4, n);.  
7f10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7f20: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
7f30: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
7f40: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
7f50: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
7f60: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
7f70: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
7f80: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
7f90: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
7fa0: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
7fb0: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
7fc0: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
7fd0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7fe0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
7ff0: 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30 20  else if( zP4!=0 
8000: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
8010: 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 );.    pOp->p
8020: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
8030: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
8040: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
8050: 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50  )n;.    if( n==P
8060: 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65 33  4_VTAB ) sqlite3
8070: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
8080: 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  *)zP4);.  }.}../
8090: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
80a0: 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P4 operand of th
80b0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
80c0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
80d0: 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c  n .** to the val
80e0: 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ue defined by th
80f0: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
8100: 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70 65  is is a high-spe
8110: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
8120: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8130: 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  geP4()..**.** Th
8140: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75 73  e P4 operand mus
8150: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
8160: 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69 6e  previously defin
8170: 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65 77  ed.  And the new
8180: 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74 20  .** P4 must not 
8190: 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55 73  be P4_INT32.  Us
81a0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
81b0: 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68 65  ngeP4() in eithe
81c0: 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61  r of.** those ca
81d0: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
81e0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
81f0: 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a  (Vdbe *p, void *
8200: 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56  pP4, int n){.  V
8210: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  dbeOp *pOp;.  as
8220: 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33  sert( n!=P4_INT3
8230: 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20  2 && n!=P4_VTAB 
8240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d  );.  assert( n<=
8250: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  0 );.  if( p->db
8260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8270: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
8280: 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d  db, n, pP4);.  }
8290: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
82a0: 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20 20  ( pP4!=0 );.    
82b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
82c0: 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 70   );.    pOp = &p
82d0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
82e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
82f0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
8300: 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d  USED );.    pOp-
8310: 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20  >p4type = n;.   
8320: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34   pOp->p4.p = pP4
8330: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8340: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
8350: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8360: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
8370: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
8380: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
8390: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
83a0: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
83b0: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
83c0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
83d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
83e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79  se->pVdbe;.  Key
83f0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
8400: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
8410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
8420: 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66  !=0 );.  pKeyInf
8430: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
8440: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
8450: 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20 70  , pIdx);.  if( p
8460: 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74 65  KeyInfo ) sqlite
8470: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
8480: 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45   pKeyInfo, P4_KE
8490: 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65  YINFO);.}..#ifde
84a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
84b0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
84c0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
84d0: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
84e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
84f0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
8500: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
8510: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
8520: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
8530: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
8540: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
8550: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
8560: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
8570: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
8580: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
8590: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
85a0: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
85b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
85c0: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
85d0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
85e0: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
85f0: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
8600: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
8610: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
8620: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
8630: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
8640: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
8650: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8660: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
8670: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
8680: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
8690: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
86a0: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
86b0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
86c0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
86d0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
86e0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
86f0: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
8700: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
8710: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
8720: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
8730: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
8740: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
8750: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
8760: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
8770: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
8780: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
8790: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
87a0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
87b0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
87c0: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
87d0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
87e0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
87f0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
8800: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
8810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8820: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
8830: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
8840: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
8850: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
8860: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
8870: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
8880: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
8890: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
88a0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
88b0: 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  RAGE./*.** Set t
88c0: 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  he value if the 
88d0: 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66  iSrcLine field f
88e0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  or the previousl
88f0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
8900: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
8910: 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e  ite3VdbeSetLineN
8920: 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69  umber(Vdbe *v, i
8930: 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c  nt iLine){.  sql
8940: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
8950: 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  -1)->iSrcLine = 
8960: 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  iLine;.}.#endif 
8970: 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  /* SQLITE_VDBE_C
8980: 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a  OVERAGE */../*.*
8990: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
89a0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
89b0: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
89c0: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
89d0: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
89e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
89f0: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
8a00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
8a10: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
8a20: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
8a30: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
8a40: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
8a50: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
8a60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
8a70: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
8a80: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
8a90: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
8aa0: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
8ab0: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
8ac0: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
8ad0: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
8ae0: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
8af0: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
8b00: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
8b10: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
8b20: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
8b30: 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74  ter an OOM fault
8b40: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
8b50: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
8b60: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
8b70: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
8b80: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
8b90: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
8ba0: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
8bb0: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
8bc0: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
8bd0: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
8be0: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
8bf0: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
8c00: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
8c10: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
8c20: 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ind..*/.VdbeOp *
8c30: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
8c40: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
8c50: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
8c60: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
8c70: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
8c80: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
8c90: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
8ca0: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
8cb0: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
8cc0: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
8cd0: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
8ce0: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
8cf0: 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f  VdbeOp dummy;  /
8d00: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56  * Ignore the MSV
8d10: 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  C warning about 
8d20: 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  no initializer *
8d30: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  /.  assert( p->m
8d40: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
8d50: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61  _INIT );.  if( a
8d60: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
8d70: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
8d80: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
8d90: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
8da0: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
8db0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
8dc0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
8dd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
8de0: 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70    return (VdbeOp
8df0: 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  *)&dummy;.  }els
8e00: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
8e10: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
8e20: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
8e30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
8e40: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a  PLAIN_COMMENTS).
8e50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
8e60: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
8e70: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72  r one of the par
8e80: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ameters to the o
8e90: 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74  pcode pOp.** det
8ea0: 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61  ermined by chara
8eb0: 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69  cter c..*/.stati
8ec0: 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50  c int translateP
8ed0: 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f  (char c, const O
8ee0: 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63  p *pOp){.  if( c
8ef0: 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 70  =='1' ) return p
8f00: 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d  Op->p1;.  if( c=
8f10: 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='2' ) return pO
8f20: 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p2;.  if( c==
8f30: 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '3' ) return pOp
8f40: 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p3;.  if( c=='
8f50: 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  4' ) return pOp-
8f60: 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  >p4.i;.  return 
8f70: 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  pOp->p5;.}../*.*
8f80: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
8f90: 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d  ng for the "comm
8fa0: 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20  ent" field of a 
8fb0: 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74  VDBE opcode list
8fc0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ing..**.** The S
8fd0: 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69  ynopsis: field i
8fe0: 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  n comments in th
8ff0: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
9000: 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72  file gets conver
9010: 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74  ted.** to an ext
9020: 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69  ra string that i
9030: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
9040: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
9050: 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a  ame().  In the.*
9060: 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68  * absence of oth
9070: 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69  er comments, thi
9080: 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d  s synopsis becom
9090: 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  es the comment o
90a0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a  n the opcode..**
90b0: 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f   Some translatio
90c0: 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20  n occurs:.**.** 
90d0: 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20 20        "PX"      
90e0: 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20  ->  "r[X]".**   
90f0: 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e      "PX@PY"   ->
9100: 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20    "r[X..X+Y-1]" 
9110: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
9120: 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20  is 0 or 1.**    
9130: 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20     "PX@PY+1" -> 
9140: 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20   "r[X..X+Y]"    
9150: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69  or "r[x]" if y i
9160: 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59  s 0.**       "PY
9170: 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e  ..PY"  ->  "r[X.
9180: 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b  .Y]"      or "r[
9190: 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73  x]" if y<=x.*/.s
91a0: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
91b0: 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73  yComment(.  cons
91c0: 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f  t Op *pOp,     /
91d0: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  * The opcode to 
91e0: 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a  be commented */.
91f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9200: 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  4,   /* Previous
9210: 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75  ly obtained valu
9220: 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68  e for P4 */.  ch
9230: 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20  ar *zTemp,      
9240: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
9250: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
9260: 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a  Temp          /*
9270: 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
9280: 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29   in zTemp[] */.)
9290: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
92a0: 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  zOpName;.  const
92b0: 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73   char *zSynopsis
92c0: 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b  ;.  int nOpName;
92d0: 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20  .  int ii, jj;. 
92e0: 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a   char zAlt[50];.
92f0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
9300: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
9310: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
9320: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
9330: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
9340: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
9350: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
9360: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
9370: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
9380: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
9390: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
93a0: 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73  e + 1;.    if( s
93b0: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
93c0: 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"IF ",3)==0 ){.
93d0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
93e0: 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  5 & SQLITE_STORE
93f0: 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  P2 ){.        sq
9400: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
9410: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c  izeof(zAlt), zAl
9420: 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29  t, "r[P2] = (%s)
9430: 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b  ", zSynopsis+3);
9440: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9460: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
9470: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25  lt), zAlt, "if %
9480: 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e  s goto P2", zSyn
9490: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
94a0: 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69  }.      zSynopsi
94b0: 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a  s = zAlt;.    }.
94c0: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
94d0: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
94e0: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
94f0: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
9500: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
9510: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
9520: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
9530: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
9540: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9550: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9560: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9570: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
9580: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9590: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
95a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
95b0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
95c0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
95d0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
95e0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
95f0: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
9600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9610: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
9620: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
9630: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
9640: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9650: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9660: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
9670: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
9680: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9690: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
96a0: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
96b0: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
96c0: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
96d0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
96e0: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
96f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
9700: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
9710: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
9720: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
9730: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
9740: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
9750: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9760: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
9770: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
9780: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9790: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
97a0: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
97b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
97c0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
97d0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
97e0: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
97f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9800: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
9810: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
9820: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
9830: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
9840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9850: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
9860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
9870: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
9880: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9890: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
98a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
98b0: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
98c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
98d0: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
98e0: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
98f0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
9900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9910: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
9920: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
9930: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
9940: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
9950: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9960: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
9970: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
9980: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
9990: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
99a0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
99b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
99c0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
99d0: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
99e0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
99f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9a00: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
9a10: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
9a20: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
9a30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
9a40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9a50: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23  LITE_DEBUG */..#
9a60: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
9a70: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
9a80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
9a90: 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  OR_HINTS)./*.** 
9aa0: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34  Translate the P4
9ab0: 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72  .pExpr value for
9ac0: 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e   an OP_CursorHin
9ad0: 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65  t opcode into te
9ae0: 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  xt.** that can b
9af0: 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74  e displayed in t
9b00: 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20  he P4 column of 
9b10: 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a  EXPLAIN output..
9b20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
9b30: 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74 72  isplayP4Expr(Str
9b40: 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a  Accum *p, Expr *
9b50: 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20  pExpr){.  const 
9b60: 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20  char *zOp = 0;. 
9b70: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
9b80: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
9b90: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  K_STRING:.      
9ba0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
9bb0: 6e 64 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78  ndf(p, "%Q", pEx
9bc0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
9bd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9be0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
9bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9c00: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
9c10: 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  d", pExpr->u.iVa
9c20: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
9c30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
9c40: 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ULL:.      sqlit
9c50: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
9c60: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
9c70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9c80: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
9c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
9ca0: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 5b  r_appendf(p, "r[
9cb0: 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d]", pExpr->iTa
9cc0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
9cd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9ce0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
9cf0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9d00: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
9d10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
9d20: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 6f 77  _appendf(p, "row
9d30: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
9d40: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9d50: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
9d60: 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45  , "c%d", (int)pE
9d70: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
9d80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9d90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9da0: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
9db0: 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20  Op = "LT";      
9dc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9dd0: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_LE:      zOp 
9de0: 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65  = "LE";      bre
9df0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e00: 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GT:      zOp = "
9e10: 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GT";      break;
9e20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
9e30: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22        zOp = "GE"
9e40: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9e50: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
9e60: 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20     zOp = "NE";  
9e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9e80: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
9e90: 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  zOp = "EQ";     
9ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9eb0: 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70   TK_IS:      zOp
9ec0: 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72   = "IS";      br
9ed0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9ee0: 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20  _ISNOT:   zOp = 
9ef0: 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b  "ISNOT";   break
9f00: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
9f10: 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e  D:     zOp = "AN
9f20: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  D";     break;. 
9f30: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
9f40: 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20      zOp = "OR"; 
9f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9f60: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
9f70: 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20   zOp = "ADD";   
9f80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9f90: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f  e TK_STAR:    zO
9fa0: 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62  p = "MUL";     b
9fb0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9fc0: 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d  K_MINUS:   zOp =
9fd0: 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61   "SUB";     brea
9fe0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
9ff0: 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52  EM:     zOp = "R
a000: 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EM";     break;.
a010: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
a020: 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41  ND:  zOp = "BITA
a030: 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ND";  break;.   
a040: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
a050: 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b    zOp = "BITOR";
a060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a070: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
a080: 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20  Op = "DIV";     
a090: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a0a0: 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_LSHIFT:  zOp 
a0b0: 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65  = "LSHIFT";  bre
a0c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a0d0: 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22  RSHIFT:  zOp = "
a0e0: 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b  RSHIFT";  break;
a0f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
a100: 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e  CAT:  zOp = "CON
a110: 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  CAT";  break;.  
a120: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
a130: 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22  :  zOp = "MINUS"
a140: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
a150: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
a160: 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20  zOp = "PLUS";   
a170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a180: 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70   TK_BITNOT:  zOp
a190: 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72   = "BITNOT";  br
a1a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a1b0: 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _NOT:     zOp = 
a1c0: 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  "NOT";     break
a1d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
a1e0: 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53  NULL:  zOp = "IS
a1f0: 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NULL";  break;. 
a200: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
a210: 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55  LL: zOp = "NOTNU
a220: 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
a230: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
a240: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a250: 6e 64 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78  ndf(p, "%s", "ex
a260: 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pr");.      brea
a270: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f  k;.  }..  if( zO
a280: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
a290: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a2a0: 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20  "%s(", zOp);.   
a2b0: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
a2c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
a2d0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
a2e0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
a2f0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a300: 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20  nd(p, ",", 1);. 
a310: 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78       displayP4Ex
a320: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69  pr(p, pExpr->pRi
a330: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
a340: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a350: 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20  nd(p, ")", 1);. 
a360: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56   }.}.#endif /* V
a370: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
a380: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
a390: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
a3a0: 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56  INTS) */...#if V
a3b0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f  DBE_DISPLAY_P4./
a3c0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
a3d0: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
a3e0: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
a3f0: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
a400: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
a410: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
a420: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
a430: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
a440: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
a450: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
a460: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
a470: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
a480: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74  P4 = zTemp;.  St
a490: 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65  rAccum x;.  asse
a4a0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
a4b0: 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
a4c0: 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54  umInit(&x, 0, zT
a4d0: 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a  emp, nTemp, 0);.
a4e0: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
a4f0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
a500: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
a510: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
a520: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
a530: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
a540: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  KeyInfo;.      a
a550: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
a560: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
a570: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
a580: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
a590: 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  "k(%d", pKeyInfo
a5a0: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a 20 20  ->nKeyField);.  
a5b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a5c0: 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
a5d0: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
a5e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
a5f0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
a600: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
a610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
a620: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
a630: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  ->zName : "";.  
a640: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
a650: 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22  (zColl, "BINARY"
a660: 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  )==0 ) zColl = "
a670: 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  B";.        sqli
a680: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a690: 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 0a 20 20  &x, ",%s%s", .  
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
a6b0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
a6c0: 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c  r[j] ? "-" : "",
a6d0: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d   zColl);.      }
a6e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a6f0: 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 29  tr_append(&x, ")
a700: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
a710: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
a720: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
a730: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
a740: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
a750: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
a760: 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e  xpr(&x, pOp->p4.
a770: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  pExpr);.      br
a780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
a790: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  f.    case P4_CO
a7a0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
a7b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
a7c0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
a7d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a7e0: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 28 25  _appendf(&x, "(%
a7f0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
a800: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
a810: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a820: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
a830: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
a840: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
a850: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
a860: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a870: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
a880: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
a890: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
a8a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64  eak;.    }.#if d
a8b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
a8c0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
a8d0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
a8e0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
a8f0: 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  X: {.      FuncD
a900: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
a910: 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a  p4.pCtx->pFunc;.
a920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a930: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
a940: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
a950: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
a960: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a970: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a980: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
a990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a9a0: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
a9b0: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
a9c0: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
a9d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a9e0: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
a9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
aa00: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 64  _appendf(&x, "%d
aa10: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
aa20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa30: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
aa40: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
aa50: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
aa60: 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  &x, "%.16g", *pO
aa70: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
aa80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aa90: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
aaa0: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
aab0: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
aac0: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
aad0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
aae0: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
aaf0: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
ab00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
ab10: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
ab20: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
ab30: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
ab40: 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70  df(&x, "%lld", p
ab50: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
ab60: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
ab70: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
ab80: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
ab90: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
aba0: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  (&x, "%.16g", pM
abb0: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
abc0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
abd0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
abe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
abf0: 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20  = "NULL";.      
ac00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
ac10: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
ac20: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
ac30: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
ac40: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
ac50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ac60: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ac70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
ac80: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
ac90: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
aca0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
acb0: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
acc0: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
acd0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ace0: 65 6e 64 66 28 26 78 2c 20 22 76 74 61 62 3a 25  endf(&x, "vtab:%
acf0: 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  p", pVtab);.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
ad10: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
ad20: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
ad30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
ad40: 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e   int *ai = pOp->
ad50: 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74  p4.ai;.      int
ad60: 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a   n = ai[0];   /*
ad70: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
ad80: 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41  nt of an INTARRA
ad90: 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a  Y is always the.
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20         ** count 
adc0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
add0: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c   elements to fol
ade0: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  low */.      for
adf0: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
ae00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ae10: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
ae20: 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b  , ",%d", ai[i]);
ae30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
ae40: 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20  Temp[0] = '[';. 
ae50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
ae60: 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c  _append(&x, "]",
ae70: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
ae80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ae90: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20   P4_SUBPROGRAM: 
aea0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
aeb0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
aec0: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
aed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
aee0: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42 4c     case P4_DYNBL
aef0: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  OB:.    case P4_
af00: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
af10: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
af20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af30: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54 41  }.    case P4_TA
af40: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
af50: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
af60: 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  (&x, "%s", pOp->
af70: 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  p4.pTab->zName);
af80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
af90: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
afa0: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
afb0: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
afc0: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
afd0: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
afe0: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
aff0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
b000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
b010: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
b020: 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74  sh(&x);.  assert
b030: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
b040: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
b050: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
b060: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  AY_P4 */../*.** 
b070: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
b080: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
b090: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
b0a0: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
b0b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
b0c0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
b0d0: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
b0e0: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
b0f0: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
b100: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
b110: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
b120: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
b130: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
b140: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
b150: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
b160: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
b170: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
b180: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
b190: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
b1a0: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
b1b0: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
b1c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b1d0: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
b1e0: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
b1f0: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
b200: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
b210: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
b220: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
b230: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
b240: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
b250: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
b260: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
b270: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
b280: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
b290: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
b2a0: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
b2b0: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
b2c0: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
b2d0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
b2e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
b2f0: 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20  ED_CACHE)./*.** 
b300: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
b310: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
b320: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
b330: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
b340: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
b350: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
b360: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
b370: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
b380: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
b390: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
b3a0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
b3b0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
b3c0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
b3d0: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
b3e0: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
b3f0: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
b400: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
b410: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
b420: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
b430: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
b440: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
b450: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
b460: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
b470: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
b480: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
b490: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
b4a0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
b4b0: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
b4c0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
b4d0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
b4e0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
b4f0: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
b500: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
b510: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
b520: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
b530: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
b540: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
b550: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
b560: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
b570: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
b580: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
b590: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
b5a0: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
b5b0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
b5c0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
b5d0: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
b5e0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
b5f0: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
b600: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
b610: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
b620: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
b630: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
b640: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
b650: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
b660: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
b670: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
b680: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
b690: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
b6a0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
b6b0: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
b6c0: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
b6d0: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
b6e0: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
b6f0: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
b700: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
b710: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
b720: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
b730: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
b740: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
b750: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
b760: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
b770: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
b780: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
b790: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
b7a0: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
b7b0: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
b7c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
b7d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
b7e0: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
b7f0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
b800: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
b810: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
b820: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
b830: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
b840: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
b850: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
b860: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
b870: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
b880: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
b890: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
b8a0: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
b8b0: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
b8c0: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
b8d0: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
b8e0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ()..*/.static SQ
b8f0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
b900: 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62  id vdbeLeave(Vdb
b910: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
b920: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b930: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
b940: 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  nDb;.  db = p->d
b950: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
b960: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
b970: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
b980: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
b990: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
b9a0: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
b9b0: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
b9c0: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
b9d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b9e0: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
b9f0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
ba00: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
ba10: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
ba20: 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  p){.  if( DbMask
ba30: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
ba40: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
ba50: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
ba60: 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76  se */.  vdbeLeav
ba70: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e(p);.}.#endif..
ba80: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
ba90: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
baa0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
bab0: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
bac0: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
bad0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bae0: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
baf0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
bb00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
bb10: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
bb20: 20 69 6e 74 20 70 63 2c 20 56 64 62 65 4f 70 20   int pc, VdbeOp 
bb30: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
bb40: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
bb50: 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d  50];.  char zCom
bb60: 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  [100];.  static 
bb70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
bb80: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
bb90: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
bba0: 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  13s %.2X %s\n";.
bbb0: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
bbc0: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
bbd0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
bbe0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
bbf0: 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65  of(zPtr));.#ifde
bc00: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bc10: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
bc20: 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  .  displayCommen
bc30: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d  t(pOp, zP4, zCom
bc40: 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b  , sizeof(zCom));
bc50: 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d  .#else.  zCom[0]
bc60: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f   = 0;.#endif.  /
bc70: 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74  * NB:  The sqlit
bc80: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66  e3OpcodeName() f
bc90: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
bca0: 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63  mented by code c
bcb0: 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74  reated.  ** by t
bcc0: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
bcd0: 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61   and mkopcodec.a
bce0: 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68  wk scripts which
bcf0: 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a   extract the.  *
bd00: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
bd10: 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  om the vdbe.c so
bd20: 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66  urce text */.  f
bd30: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
bd40: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
bd50: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
bd60: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
bd70: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
bd80: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
bd90: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20  , pOp->p5,.     
bda0: 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c   zCom.  );.  ffl
bdb0: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
bdc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
bdd0: 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f  alize an array o
bde0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e  f N Mem element.
bdf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
be00: 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d  initMemArray(Mem
be10: 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69   *p, int N, sqli
be20: 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61  te3 *db, u16 fla
be30: 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e  gs){.  while( (N
be40: 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  --)>0 ){.    p->
be50: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e  db = db;.    p->
be60: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
be70: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
be80: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
be90: 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70  E_DEBUG.    p->p
bea0: 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23  ScopyFrom = 0;.#
beb0: 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20  endif.    p++;. 
bec0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
bed0: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
bee0: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
bef0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
bf00: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
bf10: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
bf20: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20  if( p && N ){.  
bf30: 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70    Mem *pEnd = &p
bf40: 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [N];.    sqlite3
bf50: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
bf60: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
bf70: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
bf80: 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
bf90: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
bfa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
bfb0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
bfc0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
bfd0: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72  <pEnd );.      r
bfe0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
bff0: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72   do{.      asser
c000: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
c010: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
c020: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73  ].db );.      as
c030: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
c040: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
c050: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
c060: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
c070: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
c080: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
c090: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
c0a0: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
c0b0: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
c0c0: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
c0d0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
c0e0: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
c0f0: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
c100: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
c110: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
c120: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
c130: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c140: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
c150: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
c160: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
c170: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
c180: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
c190: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
c1a0: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
c1b0: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
c1c0: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
c1d0: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
c1e0: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
c1f0: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
c200: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
c210: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
c220: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
c230: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
c240: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
c250: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
c260: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
c270: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
c280: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
c290: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
c2a0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
c2b0: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
c2c0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
c2d0: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
c2e0: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
c2f0: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
c300: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
c310: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
c320: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
c330: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
c340: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
c350: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74  M_Agg );.      t
c360: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
c370: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
c380: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c390: 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69 74 65 33 56  ->xDel==sqlite3V
c3a0: 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 20 29  dbeFrameMemDel )
c3b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
c3c0: 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45  lags&(MEM_Agg|ME
c3d0: 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20  M_Dyn) ){.      
c3e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
c3f0: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
c400: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
c410: 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
c420: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c430: 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  NN(db, p->zMallo
c440: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  c);.        p->s
c450: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
c460: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
c470: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
c480: 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ined;.    }while
c490: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
c4a0: 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
c4b0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
c4c0: 20 56 65 72 69 66 79 20 74 68 61 74 20 70 46 72   Verify that pFr
c4d0: 61 6d 65 20 69 73 20 61 20 76 61 6c 69 64 20 56  ame is a valid V
c4e0: 64 62 65 46 72 61 6d 65 20 70 6f 69 6e 74 65 72  dbeFrame pointer
c4f0: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
c500: 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 64 20 66  f it is.** and f
c510: 61 6c 73 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  alse if somethin
c520: 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  g is wrong..**.*
c530: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c540: 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75  s intended for u
c550: 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  se inside of ass
c560: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
c570: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71   only..*/.int sq
c580: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49 73  lite3VdbeFrameIs
c590: 56 61 6c 69 64 28 56 64 62 65 46 72 61 6d 65 20  Valid(VdbeFrame 
c5a0: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69 66 28 20  *pFrame){.  if( 
c5b0: 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65 4d 61  pFrame->iFrameMa
c5c0: 67 69 63 21 3d 53 51 4c 49 54 45 5f 46 52 41 4d  gic!=SQLITE_FRAM
c5d0: 45 5f 4d 41 47 49 43 20 29 20 72 65 74 75 72 6e  E_MAGIC ) return
c5e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
c5f0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c600: 20 54 68 69 73 20 69 73 20 61 20 64 65 73 74 72   This is a destr
c610: 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65 6d 20 6f  uctor on a Mem o
c620: 62 6a 65 63 74 20 28 77 68 69 63 68 20 69 73 20  bject (which is 
c630: 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c 69 74 65  really an sqlite
c640: 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74 68 61 74  3_value).** that
c650: 20 64 65 6c 65 74 65 73 20 74 68 65 20 46 72 61   deletes the Fra
c660: 6d 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  me object that i
c670: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  s attached to it
c680: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a   as a blob..**.*
c690: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
c6a0: 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74 65 20 74  oes not delete t
c6b0: 68 65 20 46 72 61 6d 65 20 72 69 67 68 74 20 61  he Frame right a
c6c0: 77 61 79 2e 20 20 49 74 20 6d 65 72 65 6c 79 20  way.  It merely 
c6d0: 61 64 64 73 20 74 68 65 0a 2a 2a 20 66 72 61 6d  adds the.** fram
c6e0: 65 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 66  e to a list of f
c6f0: 72 61 6d 65 73 20 74 6f 20 62 65 20 64 65 6c 65  rames to be dele
c700: 74 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62  ted when the Vdb
c710: 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76 6f 69 64  e halts..*/.void
c720: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
c730: 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20 2a 70 41  eMemDel(void *pA
c740: 72 67 29 7b 0a 20 20 56 64 62 65 46 72 61 6d 65  rg){.  VdbeFrame
c750: 20 2a 70 46 72 61 6d 65 20 3d 20 28 56 64 62 65   *pFrame = (Vdbe
c760: 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a 20 20 61  Frame*)pArg;.  a
c770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
c780: 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 70  beFrameIsValid(p
c790: 46 72 61 6d 65 29 20 29 3b 0a 20 20 70 46 72 61  Frame) );.  pFra
c7a0: 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 46  me->pParent = pF
c7b0: 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61  rame->v->pDelFra
c7c0: 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 76 2d  me;.  pFrame->v-
c7d0: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 46 72  >pDelFrame = pFr
c7e0: 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  ame;.}.../*.** D
c7f0: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
c800: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
c810: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
c820: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
c830: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
c840: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
c850: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
c860: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
c870: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
c880: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
c890: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
c8a0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
c8b0: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
c8c0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
c8d0: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
c8e0: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
c8f0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
c900: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
c910: 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28  dbeFrameIsValid(
c920: 70 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p) );.  for(i=0;
c930: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
c940: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
c950: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
c960: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
c970: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
c980: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
c990: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
c9a0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
c9b0: 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62  AuxData(p->v->db
c9c0: 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
c9d0: 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  -1, 0);.  sqlite
c9e0: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
c9f0: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
ca00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
ca10: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
ca20: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
ca30: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
ca40: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
ca50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
ca60: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
ca70: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
ca80: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
ca90: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
caa0: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
cab0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
cac0: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
cad0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
cae0: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
caf0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
cb00: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
cb10: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
cb20: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
cb30: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
cb40: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
cb50: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
cb60: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
cb70: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
cb80: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
cb90: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
cba0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
cbb0: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
cbc0: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
cbd0: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
cbe0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
cbf0: 20 32 30 31 38 2d 30 34 2d 32 34 3a 20 20 49 6e   2018-04-24:  In
cc00: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 6d   p->explain==2 m
cc10: 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69 74  ode, the OP_Init
cc20: 20 6f 70 63 6f 64 65 73 20 6f 66 20 74 72 69 67   opcodes of trig
cc30: 67 65 72 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  gers.** are also
cc40: 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68 61 74 20   shown, so that 
cc50: 74 68 65 20 62 6f 75 6e 64 61 72 69 65 73 20 62  the boundaries b
cc60: 65 74 77 65 65 6e 20 74 68 65 20 6d 61 69 6e 20  etween the main 
cc70: 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a 20 65  program and.** e
cc80: 61 63 68 20 74 72 69 67 67 65 72 20 61 72 65 20  ach trigger are 
cc90: 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  clear..**.** Whe
cca0: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
ccb0: 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20   first the main 
ccc0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65  program is liste
ccd0: 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a  d, then each of.
cce0: 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73  ** the trigger s
ccf0: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c  ubprograms are l
cd00: 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65  isted one by one
cd10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cd20: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
cd30: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
cd40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
cd50: 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  E */.){.  int nR
cd60: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd80: 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20  * Stop when row 
cd90: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68  count reaches th
cda0: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  is */.  int nSub
cdb0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cdd0: 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64  Number of sub-vd
cde0: 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20  bes seen so far 
cdf0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
ce00: 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20  **apSub = 0;    
ce10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
ce20: 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  ay of sub-vdbes 
ce30: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d  */.  Mem *pSub =
ce40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ce50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
ce60: 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72  ory cell hold ar
ce70: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20  ray of subprogs 
ce80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
ce90: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
cea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ceb0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
cec0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  tion */.  int i;
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cef0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
cf00: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
cf10: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
cf20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
cf30: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
cf40: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
cf50: 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  m[1];           
cf60: 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f    /* First Mem o
cf70: 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  f result set */.
cf80: 20 20 69 6e 74 20 62 4c 69 73 74 53 75 62 70 72    int bListSubpr
cf90: 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61 69  ogs = (p->explai
cfa0: 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c 61  n==1 || (db->fla
cfb0: 67 73 20 26 20 53 51 4c 49 54 45 5f 54 72 69 67  gs & SQLITE_Trig
cfc0: 67 65 72 45 51 50 29 21 3d 30 29 3b 0a 20 20 4f  gerEQP)!=0);.  O
cfd0: 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20 61  p *pOp = 0;..  a
cfe0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
cff0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
d000: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
d010: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
d020: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
d030: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
d040: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
d050: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
d060: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
d070: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
d080: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
d090: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
d0a0: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
d0b0: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
d0c0: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
d0d0: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
d0e0: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
d0f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
d100: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
d110: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
d120: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
d130: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
d140: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
d150: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
d160: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
d170: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
d180: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
d190: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
d1a0: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
d1b0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
d1c0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
d1d0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
d1e0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
d1f0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
d200: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
d210: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
d220: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
d230: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
d240: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
d250: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
d260: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
d270: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
d280: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
d290: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
d2a0: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
d2b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
d2c0: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
d2d0: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
d2e0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
d2f0: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
d300: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
d310: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d320: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
d330: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
d340: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
d350: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
d360: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
d370: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
d380: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
d390: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
d3a0: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
d3b0: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
d3c0: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
d3d0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
d3e0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
d3f0: 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 29 7b  bListSubprogs ){
d400: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
d410: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
d420: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
d430: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
d440: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
d450: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
d460: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
d470: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
d480: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
d490: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
d4a0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
d4b0: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
d4c0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
d4d0: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
d4e0: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
d4f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
d500: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
d510: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
d520: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
d530: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
d540: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
d550: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
d560: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
d570: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
d580: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
d590: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
d5a0: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
d5b0: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
d5c0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
d5d0: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
d5e0: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
d5f0: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
d600: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
d610: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
d620: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
d630: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
d640: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
d650: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
d660: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
d670: 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20 4c 6f  while(1){  /* Lo
d680: 6f 70 20 65 78 69 74 73 20 76 69 61 20 62 72 65  op exits via bre
d690: 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d 20 70 2d  ak */.    i = p-
d6a0: 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69  >pc++;.    if( i
d6b0: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  >=nRow ){.      
d6c0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
d6d0: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  K;.      rc = SQ
d6e0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
d6f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d700: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
d710: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
d720: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
d730: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
d740: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
d750: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
d760: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
d770: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
d780: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
d790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
d7a0: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
d7b0: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
d7c0: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
d7d0: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
d7e0: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
d7f0: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
d800: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
d810: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
d820: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
d830: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61     for(j=0; i>=a
d840: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b  pSub[j]->nOp; j+
d850: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d  +){.        i -=
d860: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a   apSub[j]->nOp;.
d870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
d880: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61  p = &apSub[j]->a
d890: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  Op[i];.    }..  
d8a0: 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f    /* When an OP_
d8b0: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
d8c0: 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65  s encounter (the
d8d0: 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61   only opcode tha
d8e0: 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 61 20 50  t has.    ** a P
d8f0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
d900: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
d910: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
d920: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
d930: 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  ams.    ** kept 
d940: 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20  in p->aMem[9].z 
d950: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
d960: 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69  program - assumi
d970: 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72  ng this subprogr
d980: 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  am.    ** has no
d990: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
d9a0: 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  een..    */.    
d9b0: 69 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67  if( bListSubprog
d9c0: 73 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70 65  s && pOp->p4type
d9d0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
d9e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
d9f0: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
da00: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
da10: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
da20: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
da30: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
da40: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
da50: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
da60: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
da70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
da80: 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ==nSub ){.      
da90: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
daa0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75  3VdbeMemGrow(pSu
dab0: 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d  b, nByte, nSub!=
dac0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
dad0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
dae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
daf0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
db00: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
db10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
db20: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
db30: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
db40: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61 70 53 75  >z;.        apSu
db50: 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d  b[nSub++] = pOp-
db60: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
db70: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
db80: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
db90: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
dba0: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
dbb0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
dbc0: 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d 3e     nRow += pOp->
dbd0: 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70  p4.pProgram->nOp
dbe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dbf0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
dc00: 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b 0a 20 20  in<2 ) break;.  
dc10: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
dc20: 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 20  e==OP_Explain ) 
dc30: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
dc40: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
dc50: 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e 31 20 29  nit && p->pc>1 )
dc60: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
dc70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dc80: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
dc90: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
dca0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
dcb0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
dcc0: 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  PT;.      rc = S
dcd0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
dce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
dcf0: 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72  ror(p, sqlite3Er
dd00: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
dd10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
dd20: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 20 20  har *zP4;.      
dd30: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
dd40: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
dd50: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
dd60: 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  nt;.        pMem
dd70: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
dda0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
ddb0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a          pMem++;.
ddc0: 20 20 20 20 0a 20 20 20 20 20 20 20 20 70 4d 65      .        pMe
ddd0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
dde0: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
ddf0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
de00: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
de10: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
de20: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
de30: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
de40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
de50: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
de60: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
de70: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
de80: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
de90: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
dea0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
deb0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 7d   pMem++;.      }
dec0: 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ..      pMem->fl
ded0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
dee0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
def0: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
df20: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
df30: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
df40: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
df50: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
df60: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
df70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
df80: 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  2 */.      pMem+
df90: 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  +;..      pMem->
dfa0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
dfb0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
dfc0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
dff0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
e000: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
e010: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
e020: 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29  ize(pMem, 100) )
e030: 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20  { /* P4 */.     
e040: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
e050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e060: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e070: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
e090: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
e0a0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
e0b0: 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79     zP4 = display
e0c0: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
e0d0: 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29   pMem->szMalloc)
e0e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 21  ;.      if( zP4!
e0f0: 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  =pMem->z ){.    
e100: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b      pMem->n = 0;
e110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e120: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
e130: 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c  em, zP4, -1, SQL
e140: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
e150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e160: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
e170: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >z!=0 );.       
e180: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
e190: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
e1a0: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >z);.        pMe
e1b0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
e1c0: 55 54 46 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTF8;.      }.  
e1d0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
e1e0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
e1f0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  n==1 ){.        
e200: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
e210: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
e220: 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20  (pMem, 4) ){.   
e230: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e240: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e250: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed );.          
e260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
e270: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
e280: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
e290: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
e2a0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  _Term;.        p
e2b0: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
e2c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
e2d0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
e2e0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
e2f0: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
e300: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
e310: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
e320: 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20         pMem++;. 
e330: 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
e340: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
e350: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
e360: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
e370: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
e380: 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b  ze(pMem, 500) ){
e390: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
e3a0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
e3b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
e3c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e3d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
e3e0: 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   }.        pMem-
e3f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
e400: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
e410: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
e420: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
e430: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
e440: 30 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  00);.        pMe
e450: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
e460: 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20  UTF8;.#else.    
e470: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e480: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
e4b0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 0a  #endif.      }..
e4c0: 20 20 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c        p->nResCol
e4d0: 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e  umn = 8 - 4*(p->
e4e0: 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20  explain-1);.    
e4f0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
e500: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
e510: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
e520: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63  ITE_OK;.      rc
e530: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
e540: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
e550: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e560: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
e570: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
e580: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
e590: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
e5a0: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
e5b0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
e5c0: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
e5d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
e5e0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
e5f0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
e600: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  z = 0;.  if( p->
e610: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20  zSql ){.    z = 
e620: 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65  p->zSql;.  }else
e630: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29   if( p->nOp>=1 )
e640: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65  {.    const Vdbe
e650: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
e660: 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f  p[0];.    if( pO
e670: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
e680: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
e690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
e6a0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
e6b0: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
e6c0: 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b  sspace(*z) ) z++
e6d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
e6e0: 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51  ( z ) printf("SQ
e6f0: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a  L: [%s]\n", z);.
e700: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
e710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e720: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
e730: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
e740: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
e750: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
e760: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
e770: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
e780: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
e790: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
e7a0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
e7b0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
e7c0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
e7d0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d   sqlite3IoTrace=
e7e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
e7f0: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
e800: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
e810: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
e820: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
e830: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
e840: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
e850: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
e860: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
e870: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
e880: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
e890: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f  p->p4.z);.    fo
e8a0: 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73  r(i=0; sqlite3Is
e8b0: 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b  space(z[i]); i++
e8c0: 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ){}.    for(j=0;
e8d0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
e8e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
e8f0: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20  space(z[i]) ){. 
e900: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31         if( z[i-1
e910: 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]!=' ' ){.      
e920: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27      z[j++] = ' '
e930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e950: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
e960: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e970: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
e980: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22  sqlite3IoTrace("
e990: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
e9a0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
e9b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
e9c0: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
e9d0: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LE_IOTRACE */../
e9e0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
e9f0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73   this object des
ea00: 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f  cribes bulk memo
ea10: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
ea20: 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f   use.** by subco
ea30: 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70 72  mponents of a pr
ea40: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
ea50: 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c 6f  .  Space is allo
ea60: 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20  cated out.** of 
ea70: 61 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  a ReusableSpace 
ea80: 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20 61 6c  object by the al
ea90: 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74 69  locSpace() routi
eaa0: 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72  ne below..*/.str
eab0: 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
eac0: 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63 65  e {.  u8 *pSpace
ead0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76  ;          /* Av
eae0: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a  ailable memory *
eaf0: 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
eb00: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
eb10: 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6d  s of available m
eb20: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
eb30: 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20 20 20  Needed;         
eb40: 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74  /* Total bytes t
eb50: 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  hat could not be
eb60: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b   allocated */.};
eb70: 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f  ../* Try to allo
eb80: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
eb90: 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
eba0: 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66  ed bulk memory f
ebb0: 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20  or pBuf.** from 
ebc0: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
ebd0: 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72  e object.  Retur
ebe0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
ebf0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  he allocated.** 
ec00: 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73  memory on succes
ec10: 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  s.  If insuffici
ec20: 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ent memory is av
ec30: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a  ailable in the.*
ec40: 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  * ReusableSpace 
ec50: 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65  object, increase
ec60: 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61   the ReusableSpa
ec70: 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61  ce.nNeeded.** va
ec80: 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  lue by the amoun
ec90: 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74  t needed and ret
eca0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
ecb0: 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69  If pBuf is not i
ecc0: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
ecd0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
ece0: 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c  he memory has al
ecf0: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c  ready.** been al
ed00: 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69  located by a pri
ed10: 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  or call to this 
ed20: 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74  routine, so just
ed30: 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a   return a copy.*
ed40: 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65  * of pBuf and le
ed50: 61 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  ave ReusableSpac
ed60: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  e unchanged..**.
ed70: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f  ** This allocato
ed80: 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f  r is employed to
ed90: 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65   repurpose unuse
eda0: 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65  d slots at the e
edb0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63  nd of the.** opc
edc0: 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65  ode array of pre
edd0: 70 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20  pared state for 
ede0: 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65  other memory nee
edf0: 64 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ds of the prepar
ee00: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  ed.** statement.
ee10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ee20: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73  *allocSpace(.  s
ee30: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
ee40: 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b  ace *p,  /* Bulk
ee50: 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   memory availabl
ee60: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
ee70: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
ee80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ee90: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
eea0: 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  prior allocation
eeb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
eee0: 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a  ry needed */.){.
eef0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
ef00: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
ef10: 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69  ->pSpace) );.  i
ef20: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
ef30: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
ef40: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
ef50: 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72   nByte <= p->nFr
ef60: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ee ){.      p->n
ef70: 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20  Free -= nByte;. 
ef80: 20 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e       pBuf = &p->
ef90: 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d  pSpace[p->nFree]
efa0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
efb0: 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d     p->nNeeded +=
efc0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20   nByte;.    }.  
efd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
efe0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
eff0: 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75  (pBuf) );.  retu
f000: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
f010: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
f020: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
f030: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
f040: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
f050: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
f060: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
f070: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
f080: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
f090: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
f0a0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
f0b0: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
f0c0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
f0d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f0e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
f0f0: 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67  C_INIT || p->mag
f100: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
f110: 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ESET );..  /* Th
f120: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
f130: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
f140: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
f150: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
f160: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
f170: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
f180: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
f190: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
f1a0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
f1b0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
f1c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
f1d0: 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  UG.  for(i=0; i<
f1e0: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
f1f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
f200: 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
f210: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
f220: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
f230: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
f240: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
f250: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
f260: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
f270: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
f280: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
f290: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
f2a0: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
f2b0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43  t = 0;.  p->nFkC
f2c0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23  onstraint = 0;.#
f2d0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
f2e0: 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
f2f0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
f300: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
f310: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
f320: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
f330: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
f340: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
f350: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
f360: 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74   execution for t
f370: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66  he first time af
f380: 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20  ter.** creating 
f390: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
f3a0: 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ine.  This invol
f3b0: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
f3c0: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
f3d0: 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69   registers and i
f3e0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
f3f0: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
f400: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
f410: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
f420: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
f430: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
f440: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
f450: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
f460: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
f470: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
f480: 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20   called exactly 
f490: 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72  once on each vir
f4a0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
f4b0: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
f4c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
f4d0: 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
f4e0: 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
f4f0: 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
f500: 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
f510: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
f520: 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f  further calls to
f530: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
f540: 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
f550: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
f560: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
f570: 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
f580: 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
f590: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
f5a0: 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
f5b0: 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
f5c0: 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
f5d0: 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
f5e0: 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
f5f0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
f600: 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
f610: 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
f620: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
f630: 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
f640: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
f650: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
f660: 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
f670: 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
f680: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
f690: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
f6a0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
f6b0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6d0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
f6e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
f710: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
f720: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
f730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f740: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
f750: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
f760: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
f770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f780: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
f790: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
f7a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f7b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f7c0: 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
f7d0: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
f7e0: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f800: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
f810: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
f820: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f840: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
f850: 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
f860: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ams */.  int n; 
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
f890: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72  counter */.  str
f8a0: 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
f8b0: 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  e x;        /* R
f8c0: 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d  eusable bulk mem
f8d0: 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ory */..  assert
f8e0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
f8f0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
f900: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
f910: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f920: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
f930: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
f940: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
f950: 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64  p->pParse );.  d
f960: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
f970: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
f980: 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56  ailed==0 );.  nV
f990: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  ar = pParse->nVa
f9a0: 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72  r;.  nMem = pPar
f9b0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72  se->nMem;.  nCur
f9c0: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
f9d0: 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61  ab;.  nArg = pPa
f9e0: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20  rse->nMaxArg;.  
f9f0: 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73 6f  .  /* Each curso
fa00: 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79 20  r uses a memory 
fa10: 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73 74  cell.  The first
fa20: 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72 20   cursor (cursor 
fa30: 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20  0) can.  ** use 
fa40: 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69 73  aMem[0] which is
fa50: 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 75   not otherwise u
fa60: 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  sed by the VDBE 
fa70: 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61  program.  Alloca
fa80: 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61 74  te.  ** space at
fa90: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d   the end of aMem
faa0: 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20 31  [] for cursors 1
fab0: 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20 20   and greater..  
fac0: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
fad0: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
fae0: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
faf0: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75  ursor;.  if( nCu
fb00: 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e  rsor==0 && nMem>
fb10: 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20  0 ) nMem++;  /* 
fb20: 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30  Space for aMem[0
fb30: 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73  ] even if not us
fb40: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ed */..  /* Figu
fb50: 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
fb60: 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20  reusable memory 
fb70: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  is available at 
fb80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
fb90: 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79   ** opcode array
fba0: 2e 20 20 54 68 69 73 20 65 78 74 72 61 20 6d 65  .  This extra me
fbb0: 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65 61  mory will be rea
fbc0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74 68  llocated for oth
fbd0: 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  er elements.  **
fbe0: 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64   of the prepared
fbf0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
fc00: 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69  .  n = ROUND8(si
fc10: 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29  zeof(Op)*p->nOp)
fc20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
fc30: 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64  * Bytes of opcod
fc40: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f  e memory used */
fc50: 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26 28  .  x.pSpace = &(
fc60: 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b  (u8*)p->aOp)[n];
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fc80: 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65 20  * Unused opcode 
fc90: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
fca0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
fcb0: 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63  LIGNMENT(x.pSpac
fcc0: 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20  e) );.  x.nFree 
fcd0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61  = ROUNDDOWN8(pPa
fce0: 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d  rse->szOpAlloc -
fcf0: 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f   n);  /* Bytes o
fd00: 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20  f unused memory 
fd10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e  */.  assert( x.n
fd20: 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Free>=0 );.  ass
fd30: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
fd40: 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70  ALIGNMENT(&x.pSp
fd50: 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b  ace[x.nFree]) );
fd60: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
fd70: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
fd80: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
fd90: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
fda0: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
fdb0: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
fdc0: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
fdd0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
fde0: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
fdf0: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70  em = 10;.  }.  p
fe00: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
fe10: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
fe20: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
fe30: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
fe40: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
fe50: 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20   in one or two. 
fe60: 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20   ** passes.  On 
fe70: 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20  the first pass, 
fe80: 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20  we try to reuse 
fe90: 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61 74  unused memory at
fea0: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
feb0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
fec0: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
fed0: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
fee0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
fef0: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
ff00: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
ff10: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
ff20: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
ff30: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
ff40: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ill in the remai
ff50: 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66 72 65  nder using a fre
ff60: 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  sh memory alloca
ff70: 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  tion.  .  **.  *
ff80: 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
ff90: 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
ffa0: 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
ffb0: 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
ffc0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65  from.  ** the le
ffd0: 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61 74  ftover memory at
ffe0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
fff0: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54  opcode array.  T
10000 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69 63  his can signific
10010 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63  antly.  ** reduc
10020 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
10030 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
10040 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
10050 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b  ent..  */.  do {
10060 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d  .    x.nNeeded =
10070 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
10080 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
10090 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73   p->aMem, nMem*s
100a0 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20  izeof(Mem));.   
100b0 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63   p->aVar = alloc
100c0 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56 61  Space(&x, p->aVa
100d0 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
100e0 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  em));.    p->apA
100f0 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
10100 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41  &x, p->apArg, nA
10110 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29  rg*sizeof(Mem*))
10120 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d  ;.    p->apCsr =
10130 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10140 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
10150 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
10160 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53  sor*));.#ifdef S
10170 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
10180 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20  T_SCANSTATUS.   
10190 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
101a0 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
101b0 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69  nExec, p->nOp*si
101c0 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
101d0 69 66 0a 20 20 20 20 69 66 28 20 78 2e 6e 4e 65  if.    if( x.nNe
101e0 65 64 65 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b  eded==0 ) break;
101f0 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d 20  .    x.pSpace = 
10200 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
10210 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
10220 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a  db, x.nNeeded);.
10230 20 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e      x.nFree = x.
10240 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77 68 69 6c  nNeeded;.  }whil
10250 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  e( !db->mallocFa
10260 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 70 56  iled );..  p->pV
10270 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 70  List = pParse->p
10280 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 2d  VList;.  pParse-
10290 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20  >pVList =  0;.  
102a0 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
102b0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
102c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
102d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  iled ){.    p->n
102e0 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Var = 0;.    p->
102f0 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  nCursor = 0;.   
10300 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20   p->nMem = 0;.  
10310 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43  }else{.    p->nC
10320 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
10330 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28  .    p->nVar = (
10340 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20  ynVar)nVar;.    
10350 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
10360 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20  aVar, nVar, db, 
10370 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70  MEM_Null);.    p
10380 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ->nMem = nMem;. 
10390 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
103a0 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64  p->aMem, nMem, d
103b0 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  b, MEM_Undefined
103c0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  );.    memset(p-
103d0 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75 72 73  >apCsr, 0, nCurs
103e0 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
103f0 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20  rsor*));.#ifdef 
10400 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
10410 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
10420 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78    memset(p->anEx
10430 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69  ec, 0, p->nOp*si
10440 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
10450 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
10460 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
10470 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
10480 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
10490 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
104a0 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
104b0 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
104c0 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
104d0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
104e0 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
104f0 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
10500 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
10510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10520 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
10530 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43  x->pBtx==0 || pC
10540 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  x->eCurType==CUR
10550 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
10560 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75  switch( pCx->eCu
10570 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  rType ){.    cas
10580 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52  e CURTYPE_SORTER
10590 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
105a0 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
105b0 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20  (p->db, pCx);.  
105c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
105d0 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
105e0 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20  E_BTREE: {.     
105f0 20 69 66 28 20 70 43 78 2d 3e 69 73 45 70 68 65   if( pCx->isEphe
10600 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  meral ){.       
10610 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78 20 29   if( pCx->pBtx )
10620 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
10630 73 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20  se(pCx->pBtx);. 
10640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
10650 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
10660 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
10670 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
10680 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
10690 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
106a0 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
106b0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
106c0 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
106d0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
106e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
106f0 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
10700 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
10710 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10720 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
10730 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10740 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
10750 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
10760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
10770 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
10780 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
10790 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
107a0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
107b0 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
107c0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
107d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
107e0 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
107f0 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
10800 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
10810 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
10820 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
10830 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10840 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
10850 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
10860 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
10870 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
10880 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
10890 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
108a0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
108b0 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
108c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
108d0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
108e0 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
108f0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
10900 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
10910 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
10920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10930 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
10940 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
10950 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
10960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
10970 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
10980 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
10990 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
109a0 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
109b0 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
109c0 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
109d0 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
109e0 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
109f0 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
10a00 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
10a10 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
10a20 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
10a30 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
10a40 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
10a50 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
10a60 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
10a70 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
10a80 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
10a90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
10aa0 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
10ab0 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
10ac0 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
10ad0 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  if.  v->aOp = pF
10ae0 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
10af0 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
10b00 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
10b10 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
10b20 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
10b30 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
10b40 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
10b50 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
10b60 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
10b70 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
10b80 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
10b90 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
10ba0 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
10bb0 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e  ->nChange;.  v->
10bc0 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46  db->nChange = pF
10bd0 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b  rame->nDbChange;
10be0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
10bf0 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64  leteAuxData(v->d
10c00 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c  b, &v->pAuxData,
10c10 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41   -1, 0);.  v->pA
10c20 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d  uxData = pFrame-
10c30 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72  >pAuxData;.  pFr
10c40 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20  ame->pAuxData = 
10c50 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  0;.  return pFra
10c60 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
10c70 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
10c80 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
10c90 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
10ca0 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
10cb0 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
10cc0 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
10cd0 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
10ce0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
10cf0 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
10d00 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
10d10 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
10d20 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
10d30 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
10d40 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
10d50 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
10d60 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
10d70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10d80 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
10d90 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
10da0 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
10db0 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
10dc0 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
10dd0 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
10de0 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
10df0 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
10e00 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
10e10 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
10e20 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20  ore(pFrame);.   
10e30 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a   p->pFrame = 0;.
10e40 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20      p->nFrame = 
10e50 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
10e60 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b   p->nFrame==0 );
10e70 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
10e80 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28  nFrame(p);.  if(
10e90 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
10ea0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
10eb0 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
10ec0 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
10ed0 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
10ee0 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
10ef0 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
10f00 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
10f10 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
10f20 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
10f30 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
10f40 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pDel);.  }..  /
10f50 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78  * Delete any aux
10f60 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  data allocations
10f70 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20   made by the VM 
10f80 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78  */.  if( p->pAux
10f90 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64  Data ) sqlite3Vd
10fa0 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
10fb0 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44  p->db, &p->pAuxD
10fc0 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  ata, -1, 0);.  a
10fd0 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
10fe0 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
10ff0 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
11000 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
11010 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
11020 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
11030 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
11040 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
11050 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
11060 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
11070 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
11080 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
11090 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
110a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
110b0 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
110c0 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
110d0 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
110e0 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
110f0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
11100 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
11110 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
11120 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74  esColumn){.  int
11130 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
11140 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66  b = p->db;..  if
11150 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  ( p->nResColumn 
11160 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
11170 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
11180 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
11190 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
111a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
111b0 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
111c0 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52 65 73  ;.  }.  n = nRes
111d0 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
111e0 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
111f0 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
11200 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
11210 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
11220 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
11230 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
11240 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
11250 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
11260 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72  rn;.  initMemArr
11270 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
11280 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  n, db, MEM_Null)
11290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
112a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
112b0 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
112c0 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
112d0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
112e0 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
112f0 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
11300 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
11310 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
11320 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
11330 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
11340 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
11350 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
11360 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
11370 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
11380 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
11390 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
113a0 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
113b0 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
113c0 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
113d0 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
113e0 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
113f0 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
11400 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
11410 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
11420 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
11430 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
11440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11450 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
11460 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
11490 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
114a0 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
114d0 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
114e0 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
114f0 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
11500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11510 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
11520 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
11530 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11540 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
11550 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
11560 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
11570 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
11580 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
11590 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
115a0 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
115b0 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
115c0 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
115d0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
115e0 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
115f0 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
11600 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
11610 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
11620 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
11630 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
11640 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
11650 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
11660 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
11670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11680 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
11690 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
116a0 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
116b0 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
116c0 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
116d0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
116e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
116f0 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
11700 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
11710 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
11720 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
11730 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
11740 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
11750 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
11760 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11770 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
11780 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
11790 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
117a0 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
117b0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
117c0 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
117d0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
117e0 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
117f0 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
11800 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
11810 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
11820 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
11830 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
11840 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
11850 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
11860 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
11870 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11880 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
11890 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
118a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
118b0 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
118c0 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
118d0 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
118e0 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
118f0 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ction.          
11900 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
11910 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
11920 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20  for a two-phase 
11930 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20  commit using a. 
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
11960 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  nal */.  int rc 
11970 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11980 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
11990 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
119a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
119b0 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
119c0 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
119d0 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
119e0 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
119f0 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
11a00 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
11a10 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
11a20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11a30 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
11a40 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
11a50 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
11a60 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
11a70 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
11a80 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
11a90 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
11aa0 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
11ab0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
11ac0 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
11ad0 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
11ae0 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
11af0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11b00 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
11b10 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
11b20 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
11b30 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
11b40 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
11b50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11b60 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
11b70 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
11b80 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
11b90 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
11ba0 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
11bb0 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
11bc0 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
11bd0 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
11be0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
11bf0 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
11c00 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
11c10 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
11c20 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
11c30 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
11c40 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
11c50 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
11c60 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
11c70 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
11c80 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
11c90 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11ca0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
11cb0 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
11cc0 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
11cd0 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
11ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11cf0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
11d00 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
11d10 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11d20 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
11d30 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
11d40 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
11d50 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
11d60 20 61 20 64 61 74 61 62 61 73 65 20 6d 69 67 68   a database migh
11d70 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20  t need a master 
11d80 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20  journal depends 
11d90 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74  upon.      ** it
11da0 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28  s journal mode (
11db0 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e  among other thin
11dc0 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69  gs).  This matri
11dd0 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  x determines whi
11de0 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  ch.      ** jour
11df0 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20  nal modes use a 
11e00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
11e10 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20  nd which do not 
11e20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
11e30 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64  const u8 aMJNeed
11e40 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ed[] = {.       
11e50 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20   /* DELETE   */ 
11e60 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50   1,.        /* P
11e70 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20  ERSIST   */ 1,. 
11e80 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20         /* OFF   
11e90 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
11ea0 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a    /* TRUNCATE  *
11eb0 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
11ec0 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a  MEMORY    */ 0,.
11ed0 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20          /* WAL  
11ee0 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20       */ 0.      
11ef0 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  };.      Pager *
11f00 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67  pPager;   /* Pag
11f10 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
11f20 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20  th pBt */.      
11f30 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
11f40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
11f50 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
11f60 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
11f70 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
11f80 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
11f90 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74  db->aDb[i].safet
11fa0 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53  y_level!=PAGER_S
11fb0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20  YNCHRONOUS_OFF. 
11fc0 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64        && aMJNeed
11fd0 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47  ed[sqlite3PagerG
11fe0 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
11ff0 61 67 65 72 29 5d 0a 20 20 20 20 20 20 20 26 26  ager)].       &&
12000 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
12010 65 6d 64 62 28 70 50 61 67 65 72 29 3d 3d 30 0a  emdb(pPager)==0.
12020 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20        ){ .      
12030 20 20 61 73 73 65 72 74 28 20 69 21 3d 31 20 29    assert( i!=1 )
12040 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73  ;.        nTrans
12050 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
12060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12070 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
12080 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12090 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
120a0 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
120b0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
120c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
120d0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
120e0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
120f0 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
12100 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
12110 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
12120 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
12130 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
12140 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
12150 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
12160 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
12170 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
12180 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
12190 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
121a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
121b0 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d  OMMITHOOK;.    }
121c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
121d0 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
121e0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
121f0 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
12200 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
12210 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
12220 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
12230 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
12240 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
12250 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
12260 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
12270 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
12280 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
12290 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
122a0 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
122b0 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
122c0 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
122d0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
122e0 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
122f0 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
12300 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
12310 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
12320 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
12330 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
12340 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
12350 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
12360 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
12370 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
12380 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
12390 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
123a0 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
123b0 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
123c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
123d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
123e0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
123f0 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12400 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
12410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
12420 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12430 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12440 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
12450 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
12460 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
12470 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
12480 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
12490 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
124a0 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
124b0 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
124c0 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
124d0 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
124e0 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
124f0 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
12500 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
12510 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
12520 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
12530 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
12540 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
12550 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
12560 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
12570 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
12580 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
12590 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
125a0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
125b0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
125c0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
125d0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
125e0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
125f0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
12600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12610 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12620 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20  seTwo(pBt, 0);. 
12630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12650 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
12660 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
12670 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
12680 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
12690 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
126a0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
126b0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
126c0 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
126d0 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
126e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
126f0 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
12700 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
12710 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
12720 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  cally..  */.#ifn
12730 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12740 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
12750 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
12760 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
12770 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
12780 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
12790 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
127a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
127b0 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
127c0 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
127d0 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
127e0 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
127f0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
12800 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
12810 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
12820 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
12830 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65   res;.    int re
12840 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  tryCount = 0;.  
12850 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b    int nMainFile;
12860 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
12870 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
12880 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
12890 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    nMainFile = sq
128a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
128b0 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d  ainFile);.    zM
128c0 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
128d0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
128e0 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d  jXXXXXX9XXz", zM
128f0 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
12900 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72  ( zMaster==0 ) r
12910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12920 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20  EM_BKPT;.    do 
12930 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
12940 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dom;.      if( r
12950 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20  etryCount ){.   
12960 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
12970 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  unt>100 ){.     
12980 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
12990 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
129a0 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a  J delete: %s", z
129b0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
129c0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
129d0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
129e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
129f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
12a00 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f  else if( retryCo
12a10 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unt==1 ){.      
12a20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
12a30 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
12a40 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a   collide: %s", z
12a50 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
12a60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12a70 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20   retryCount++;. 
12a80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
12a90 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
12aa0 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
12ab0 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
12ac0 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26  3_snprintf(13, &
12ad0 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c  zMaster[nMainFil
12ae0 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32  e], "-mj%06X9%02
12af0 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X",.            
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b10 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26     (iRandom>>8)&
12b20 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f  0xffffff, iRando
12b30 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f  m&0xff);.      /
12b40 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74  * The antipenult
12b50 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20  imate character 
12b60 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
12b70 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a  urnal name must.
12b80 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20        ** be "9" 
12b90 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f  to avoid name co
12ba0 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73  llisions when us
12bb0 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65  ing 8+3 filename
12bc0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
12bd0 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69  rt( zMaster[sqli
12be0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73  te3Strlen30(zMas
12bf0 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a  ter)-3]=='9' );.
12c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c        sqlite3Fil
12c10 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69  eSuffix3(zMainFi
12c20 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  le, zMaster);.  
12c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12c40 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
12c50 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
12c60 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
12c70 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
12c80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12c90 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
12ca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12cb0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
12cc0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12cd0 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
12ce0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
12cf0 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
12d00 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
12d10 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
12d20 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
12d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
12d40 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
12d50 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
12d60 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
12d70 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
12d80 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
12d90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12db0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12dc0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12de0 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
12df0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
12e00 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
12e10 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
12e20 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
12e30 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
12e40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
12e50 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12e60 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
12e70 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
12e80 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
12e90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
12ea0 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
12eb0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
12ec0 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
12ed0 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
12ee0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
12ef0 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
12f00 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
12f10 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
12f20 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
12f30 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
12f40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
12f50 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
12f60 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
12f70 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
12f80 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12f90 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
12fa0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
12fb0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
12fc0 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
12fd0 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
12fe0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
12ff0 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( zFile==0 ){.  
13000 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
13010 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d  ;  /* Ignore TEM
13020 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64  P and :memory: d
13030 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
13040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
13050 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d  sert( zFile[0]!=
13060 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
13070 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
13080 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
13090 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
130a0 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
130b0 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
130c0 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
130d0 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
130e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
130f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
13110 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
13120 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
13130 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
13140 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
13150 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13160 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
13170 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
13180 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13190 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
131a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
131b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
131c0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
131d0 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
131e0 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
131f0 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
13200 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
13210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13220 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65   0==(sqlite3OsDe
13230 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
13240 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
13250 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
13260 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51  TIAL).     && SQ
13270 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
13280 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
13290 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
132a0 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29  C_NORMAL)).    )
132b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
132c0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
132d0 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
132e0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
132f0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
13300 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13310 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
13320 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13330 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
13340 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
13350 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
13360 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13370 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
13380 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
13390 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
133a0 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
133b0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
133c0 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
133d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
133e0 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
133f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13400 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
13410 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
13420 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
13430 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
13440 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
13450 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
13460 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
13470 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
13480 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
13490 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
134a0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
134b0 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
134c0 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
134d0 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
134e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
134f0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
13500 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
13510 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
13520 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
13530 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
13540 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
13550 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
13560 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
13570 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
13580 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
13590 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
135a0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
135b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
135c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
135d0 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
135e0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
135f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
13600 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
13610 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
13620 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
13630 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
13640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13650 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13660 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
13670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13680 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
13690 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
136a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
136b0 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
136c0 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
136d0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
136e0 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
136f0 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
13700 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
13710 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
13720 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
13730 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
13740 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
13750 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
13760 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
13770 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13780 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
13790 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
137a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
137b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
137c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
137d0 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
137e0 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
137f0 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
13800 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
13810 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
13820 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
13830 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
13840 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
13850 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
13860 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
13870 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
13880 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
13890 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
138a0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
138b0 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
138c0 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
138d0 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
138e0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
138f0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
13900 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
13910 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
13920 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
13930 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
13940 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
13950 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
13960 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
13970 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
13980 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
13990 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
139a0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
139b0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
139c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
139d0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
139e0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
139f0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
13a00 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
13a10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13a20 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
13a30 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20  eTwo(pBt, 1);.  
13a40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13a50 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
13a60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
13a70 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
13a80 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
13a90 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
13aa0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
13ab0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
13ac0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
13ad0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
13ae0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
13af0 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e  nVdbeActive coun
13b00 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
13b10 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
13b20 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
13b30 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
13b40 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
13b50 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
13b60 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
13b70 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
13b80 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
13b90 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
13ba0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
13bb0 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
13bc0 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
13bd0 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
13be0 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
13bf0 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
13c00 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
13c10 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
13c20 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
13c30 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
13c40 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
13c50 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
13c60 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
13c70 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b   int nWrite = 0;
13c80 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30  .  int nRead = 0
13c90 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
13ca0 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
13cb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13cc0 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69  _stmt_busy((sqli
13cd0 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a  te3_stmt*)p) ){.
13ce0 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
13cf0 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e     if( p->readOn
13d00 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b  ly==0 ) nWrite++
13d10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62  ;.      if( p->b
13d20 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64  IsReader ) nRead
13d30 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
13d40 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
13d50 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
13d60 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
13d70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69  ;.  assert( nWri
13d80 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  te==db->nVdbeWri
13d90 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
13da0 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65  nRead==db->nVdbe
13db0 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Read );.}.#else.
13dc0 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
13dd0 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
13de0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
13df0 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
13e00 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
13e10 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74  ment opened a st
13e20 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
13e30 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74  ion,.** close it
13e40 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65   now. Argument e
13e50 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  Op must be eithe
13e60 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
13e70 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50  BACK or.** SAVEP
13e80 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66  OINT_RELEASE. If
13e90 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
13ea0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
13eb0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
13ec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13ed0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20  rolled back. If 
13ee0 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54  eOp is SAVEPOINT
13ef0 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74  _RELEASE, then t
13f00 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
13f10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13f20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
13f30 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
13f40 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54  occurs, an SQLIT
13f50 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
13f60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
13f70 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
13f80 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
13f90 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
13fa0 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 43  INLINE int vdbeC
13fb0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
13fc0 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
13fd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73  .  sqlite3 *cons
13fe0 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  t db = p->db;.  
13ff0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14000 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  OK;.  int i;.  c
14010 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
14020 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
14030 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74  ent-1;..  assert
14040 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
14050 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70  _ROLLBACK || eOp
14060 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
14070 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ASE);.  assert( 
14080 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
14090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
140a0 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
140b0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
140c0 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
140d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
140e0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
140f0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
14100 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65  TE_OK;.    Btree
14110 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
14120 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
14130 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pBt ){.      if(
14140 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
14150 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
14160 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14170 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
14180 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
14190 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
141a0 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
141b0 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
141c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
141d0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
141e0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
141f0 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
14200 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
14210 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14220 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
14240 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
14250 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
14260 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
14270 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
14280 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0;..  if( rc==SQ
14290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
142a0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
142b0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
142c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
142d0 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
142e0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
142f0 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
14300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14320 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
14330 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
14340 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
14350 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
14360 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  int);.    }.  }.
14370 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
14380 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14390 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
143a0 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
143b0 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  store the .  ** 
143c0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
143d0 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
143e0 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
143f0 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
14400 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20   when .  ** the 
14410 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14420 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
14430 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d  .  */.  if( eOp=
14440 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
14450 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  ACK ){.    db->n
14460 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
14470 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
14480 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
14490 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  dImmCons = p->nS
144a0 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20  tmtDefImmCons;. 
144b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
144c0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
144d0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
144e0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
144f0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  ){.  if( p->db->
14500 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
14510 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
14520 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6c     return vdbeCl
14530 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20  oseStatement(p, 
14540 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eOp);.  }.  retu
14550 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14560 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
14570 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
14580 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
14590 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
145a0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
145b0 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
145c0 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
145d0 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
145e0 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
145f0 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
14600 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
14610 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
14620 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
14630 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
14640 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
14650 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
14660 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
14670 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
14680 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
14690 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
146a0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
146b0 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
146c0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
146d0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
146e0 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
146f0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
14700 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74  NKEY.** and writ
14710 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
14720 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
14730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
14740 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
14750 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
14760 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
14770 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
14780 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
14790 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
147a0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
147b0 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
147c0 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
147d0 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  ns+db->nDeferred
147e0 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20  ImmCons)>0) .   
147f0 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
14800 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
14810 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  t>0) .  ){.    p
14820 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
14830 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
14840 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KEY;.    p->erro
14850 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
14860 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rt;.    sqlite3V
14870 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52  dbeError(p, "FOR
14880 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
14890 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
148a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
148b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
148c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
148d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
148e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
148f0 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
14900 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
14910 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
14920 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
14930 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
14940 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
14950 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
14960 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
14970 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
14980 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
14990 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
149a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
149b0 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
149c0 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
149d0 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
149e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
149f0 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
14a00 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
14a10 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
14a20 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
14a30 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
14a40 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
14a50 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
14a60 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
14a70 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
14a80 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
14a90 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
14aa0 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
14ab0 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
14ac0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
14ad0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
14ae0 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
14af0 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
14b00 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
14b10 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
14b20 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
14b30 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
14b40 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
14b50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
14b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
14b70 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
14b80 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
14b90 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
14ba0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
14bb0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
14bc0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
14bd0 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
14be0 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
14bf0 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
14c00 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
14c10 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
14c20 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
14c30 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
14c40 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
14c50 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
14c60 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
14c70 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
14c80 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
14c90 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
14ca0 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
14cb0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
14cc0 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
14cd0 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
14ce0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
14cf0 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
14d00 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
14d10 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
14d20 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
14d30 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
14d40 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
14d50 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
14d60 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
14d70 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
14d80 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
14d90 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
14da0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
14db0 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
14dc0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
14dd0 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
14de0 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
14df0 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
14e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14e10 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
14e20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
14e30 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14e40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
14e50 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
14e60 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63  rs(p);.  checkAc
14e70 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
14e80 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
14e90 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
14ea0 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
14eb0 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
14ec0 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20   or if the.  ** 
14ed0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f  SQL statement do
14ee0 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77  es not read or w
14ef0 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20  rite a database 
14f00 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  file.  */.  if( 
14f10 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62  p->pc>=0 && p->b
14f20 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  IsReader ){.    
14f30 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
14f40 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
14f50 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
14f60 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
14f70 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
14f80 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
14f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14fa0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
14fb0 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
14fc0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
14fd0 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
14fe0 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
14ff0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
15000 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
15010 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
15020 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
15030 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
15040 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
15050 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
15060 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
15070 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
15080 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
150b0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
150c0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
150d0 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
150e0 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
150f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
15100 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
15110 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
15120 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
15130 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
15140 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
15150 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
15160 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
15170 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
15180 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
15190 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
151a0 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
151b0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
151c0 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
151d0 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
151e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
151f0 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
15200 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
15210 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
15220 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
15230 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
15240 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
15250 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
15260 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
15270 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
15280 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77  occurred while w
15290 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
152a0 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e  urnal, sub-journ
152b0 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20  al or database. 
152c0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
152d0 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72  part of an effor
152e0 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63  t to free up cac
152f0 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75  he space (see fu
15300 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
15310 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
15320 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72   pager.c), the r
15330 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69  ollback is requi
15340 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a  red to restore .
15350 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67        ** the pag
15360 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65  er to a consiste
15370 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
15380 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  */.      if( !p-
15390 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63  >readOnly || mrc
153a0 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  !=SQLITE_INTERRU
153b0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  PT ){.        if
153c0 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  ( (mrc==SQLITE_N
153d0 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
153e0 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e  ITE_FULL) && p->
153f0 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
15400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  ){.          eSt
15410 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
15420 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
15430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15440 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
15450 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
15460 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
15470 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
15480 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
15490 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
154a0 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
154b0 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
154c0 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
154d0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
154e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
154f0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
15500 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
15510 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
15520 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15530 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
15540 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
15550 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15560 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
15570 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
15580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15590 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
155a0 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74  eck for immediat
155b0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69  e foreign key vi
155c0 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  olations. */.   
155d0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
155e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
155f0 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
15600 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  k(p, 0);.    }. 
15610 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
15620 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
15630 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73   is set and this
15640 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
15650 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20  ive writer .    
15660 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64  ** VM, then we d
15670 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
15680 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
15690 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
156a0 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
156b0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
156c0 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
156d0 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
156e0 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
156f0 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
15700 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
15710 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
15720 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61   if( !sqlite3Vta
15730 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20  bInSync(db) .   
15740 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d    && db->autoCom
15750 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d  mit .     && db-
15760 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d  >nVdbeWrite==(p-
15770 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
15780 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
15790 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
157a0 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
157b0 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
157c0 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
157d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
157e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
157f0 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  kFk(p, 1);.     
15800 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15810 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15820 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72    if( NEVER(p->r
15830 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
15840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15850 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
15860 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15870 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
158a0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
158b0 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d  GNKEY;.        }
158c0 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
158d0 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
158e0 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
158f0 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
15900 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
15910 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
15920 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
15930 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
15940 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
15950 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
15960 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
15970 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
15980 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
15990 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
159a0 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
159b0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
159c0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
159d0 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
159e0 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
159f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
15a10 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
15a20 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
15a30 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
15a40 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
15a50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
15a60 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
15a70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15a80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15a90 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
15aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
15ab0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
15ac0 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
15ad0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
15ae0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
15af0 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  {.          db->
15b00 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
15b10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
15b20 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
15b30 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
15b40 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
15b50 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
15b60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15b70 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
15b80 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
15b90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15ba0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
15bb0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
15bc0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
15bd0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
15be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
15bf0 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
15c00 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nt = 0;.    }els
15c10 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74  e if( eStatement
15c20 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Op==0 ){.      i
15c30 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15c40 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
15c50 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
15c60 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
15c70 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
15c80 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20  NT_RELEASE;.    
15c90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
15ca0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
15cb0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
15cc0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
15cd0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15ce0 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
15cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15d00 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
15d10 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
15d20 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
15d30 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
15d40 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
15d50 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
15d60 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  t = 1;.        p
15d70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
15d80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
15d90 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65      /* If eState
15da0 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65  mentOp is non-ze
15db0 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65  ro, then a state
15dc0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
15dd0 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
15de0 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
15df0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61   rolled back. Ca
15e00 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  ll sqlite3VdbeCl
15e10 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74  oseStatement() t
15e20 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20  o.    ** do so. 
15e30 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  If this operatio
15e40 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
15e50 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  or, and the curr
15e60 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ent statement.  
15e70 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20    ** error code 
15e80 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  is SQLITE_OK or 
15e90 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
15ea0 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20  T, then promote 
15eb0 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
15ec0 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72  nt statement err
15ed0 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a  or code..    */.
15ee0 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
15ef0 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63  ntOp ){.      rc
15f00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c   = sqlite3VdbeCl
15f10 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20  oseStatement(p, 
15f20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20  eStatementOp);. 
15f30 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
15f40 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
15f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
15f60 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  p->rc&0xff)==SQL
15f70 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
15f80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
15f90 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
15fa0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15fb0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
15fc0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  .          p->zE
15fd0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
15fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
15ff0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
16000 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
16010 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
16020 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
16030 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
16040 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
16050 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
16060 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
16070 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16080 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
16090 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
160a0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
160b0 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
160c0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
160d0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
160e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
160f0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
16100 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
16110 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
16120 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
16130 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
16140 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
16150 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
16160 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
16170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16180 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
16190 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
161a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
161b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
161c0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
161d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
161e0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
161f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
16200 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
16210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
16220 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
16230 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
16240 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
16250 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
16260 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
16270 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
16280 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
16290 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b  ->nVdbeActive--;
162a0 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
162b0 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62  dOnly ) db->nVdb
162c0 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66  eWrite--;.    if
162d0 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
162e0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d   db->nVdbeRead--
162f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
16300 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64  ->nVdbeActive>=d
16310 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
16320 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
16330 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e  nVdbeRead>=db->n
16340 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20  VdbeWrite );.   
16350 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
16360 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20  beWrite>=0 );.  
16370 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
16380 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
16390 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
163a0 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
163b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
163c0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
163d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
163e0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
163f0 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
16400 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74  flag is set to t
16410 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f  rue, then any lo
16420 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65  cks that were he
16430 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65  ld.  ** by conne
16440 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f  ction db have no
16450 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e  w been released.
16460 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e   Call sqlite3Con
16470 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
16480 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b  ) .  ** to invok
16490 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75  e any required u
164a0 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
164b0 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69  lbacks..  */.  i
164c0 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
164d0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
164e0 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
164f0 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61  ed(db);.  }..  a
16500 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
16510 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e  Active>0 || db->
16520 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
16530 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
16540 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
16550 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
16560 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
16570 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
16580 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
16590 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
165a0 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
165b0 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
165c0 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
165d0 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
165e0 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
165f0 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
16600 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
16610 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
16620 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
16630 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
16640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16650 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72  *.** Copy the er
16660 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
16670 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e  or message belon
16680 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45  ging to the VDBE
16690 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
166a0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
166b0 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65   to its database
166c0 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74   handle (so that
166d0 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a   they will be .*
166e0 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61  * returned by ca
166f0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  lls to sqlite3_e
16700 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c  rrcode() and sql
16710 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a  ite3_errmsg())..
16720 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
16730 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65  ion does not cle
16740 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f  ar the VDBE erro
16750 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67  r code or messag
16760 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65  e, just.** copie
16770 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61  s them to the da
16780 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
16790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
167a0 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56  eTransferError(V
167b0 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
167c0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
167d0 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
167e0 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d  ;.  if( p->zErrM
167f0 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42  sg ){.    db->bB
16800 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20  enignMalloc++;. 
16810 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
16820 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
16830 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d     if( db->pErr=
16840 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20  =0 ) db->pErr = 
16850 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
16860 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
16870 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
16880 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
16890 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
168a0 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
168b0 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
168c0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
168d0 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e  ();.    db->bBen
168e0 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d  ignMalloc--;.  }
168f0 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 70 45 72  else if( db->pEr
16900 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
16910 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d  ValueSetNull(db-
16920 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62  >pErr);.  }.  db
16930 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
16940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16950 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16960 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a  ABLE_SQLLOG./*.*
16970 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43  * If an SQLITE_C
16980 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f  ONFIG_SQLLOG hoo
16990 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  k is registered 
169a0 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  and the VM has b
169b0 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76  een run, .** inv
169c0 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  oke it..*/.stati
169d0 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b  c void vdbeInvok
169e0 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29  eSqllog(Vdbe *v)
169f0 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  {.  if( sqlite3G
16a00 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
16a10 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51  log && v->rc==SQ
16a20 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53  LITE_OK && v->zS
16a30 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29  ql && v->pc>=0 )
16a40 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70  {.    char *zExp
16a50 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56  anded = sqlite3V
16a60 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20  dbeExpandSql(v, 
16a70 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73  v->zSql);.    as
16a80 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69  sert( v->db->ini
16a90 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
16aa0 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29   if( zExpanded )
16ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
16ac0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
16ad0 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73  log(.          s
16ae0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16af0 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76  ig.pSqllogArg, v
16b00 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c  ->db, zExpanded,
16b10 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   1.      );.    
16b20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16b30 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
16b40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
16b50 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
16b60 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78  beInvokeSqllog(x
16b70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
16b80 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
16b90 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
16ba0 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
16bb0 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
16bc0 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
16bd0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
16be0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
16bf0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
16c00 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
16c10 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
16c20 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
16c30 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
16c40 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
16c50 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
16c60 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
16c70 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
16c80 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
16c90 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
16ca0 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
16cb0 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
16cc0 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
16cd0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
16ce0 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
16cf0 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
16d00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
16d10 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
16d20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
16d30 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
16d40 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
16d50 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20  int i;.#endif.. 
16d60 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
16d70 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
16d80 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
16d90 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
16da0 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
16db0 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
16dc0 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
16dd0 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
16de0 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
16df0 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
16e00 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
16e10 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
16e20 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
16e30 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
16e40 65 6e 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  en run even part
16e50 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
16e60 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
16e70 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
16e80 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
16e90 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
16ea0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
16eb0 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
16ec0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
16ed0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
16ee0 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
16ef0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
16f00 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
16f10 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
16f20 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
16f30 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
16f40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
16f50 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
16f60 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
16f70 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
16f80 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
16f90 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
16fa0 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 69 66 28  rror(p);.    if(
16fb0 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
16fc0 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
16fd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
16fe0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
16ff0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
17000 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
17010 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
17020 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
17030 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
17040 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
17050 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
17060 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
17070 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
17080 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
17090 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
170a0 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
170b0 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
170c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
170d0 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63  ithMsg(db, p->rc
170e0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
170f0 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
17100 4d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Msg);.  }..  /* 
17110 52 65 73 65 74 20 72 65 67 69 73 74 65 72 20 63  Reset register c
17120 6f 6e 74 65 6e 74 73 20 61 6e 64 20 72 65 63 6c  ontents and recl
17130 61 69 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67  aim error messag
17140 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23  e memory..  */.#
17150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
17160 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
17170 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
17180 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
17190 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
171a0 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
171b0 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
171c0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
171d0 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
171e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  */.  if( p->apCs
171f0 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  r ) for(i=0; i<p
17200 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
17210 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
17220 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  [i]==0 );.  if( 
17230 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66  p->aMem ){.    f
17240 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=0; i<p->nMe
17250 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
17260 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
17270 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20  ==MEM_Undefined 
17280 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17290 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
172a0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
172b0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
172c0 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
172d0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
172e0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e  ITE_DEBUG.  p->n
172f0 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
17300 66 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  f..  /* Save pro
17310 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
17320 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
17330 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
17340 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
17350 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
17360 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
17370 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
17380 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
17390 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
173a0 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
173b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
173c0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
173d0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
173e0 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
173f0 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
17400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
17410 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
17420 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
17430 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
17440 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
17450 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
17460 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
17470 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
17480 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
17490 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
174a0 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
174b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
174c0 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
174d0 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
174e0 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
174f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17500 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
17510 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
17520 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
17530 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
17540 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
17550 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
17560 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
17570 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
17580 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
17590 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
175a0 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
175b0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
175c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
175d0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
175e0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
175f0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
17600 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
17610 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
17620 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
17630 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
17640 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
17650 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
17660 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
17670 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
17680 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
17690 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
176a0 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ndif.  p->magic 
176b0 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53  = VDBE_MAGIC_RES
176c0 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  ET;.  return p->
176d0 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
176e0 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
176f0 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
17700 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
17710 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
17720 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
17730 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
17740 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
17750 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
17760 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
17770 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
17780 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
17790 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
177a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
177b0 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
177c0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
177d0 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
177e0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
177f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17800 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
17810 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
17820 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
17830 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
17840 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
17850 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17860 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
17870 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
17880 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
17890 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
178a0 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
178b0 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
178c0 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
178d0 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
178e0 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
178f0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
17900 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
17910 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
17920 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
17930 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
17940 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
17950 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
17960 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
17970 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
17980 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
17990 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
179a0 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
179b0 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
179c0 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
179d0 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
179e0 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
179f0 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
17a00 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
17a10 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
17a20 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
17a30 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
17a40 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
17a50 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
17a60 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
17a70 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
17a80 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
17a90 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
17aa0 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
17ab0 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
17ac0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
17ad0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69  orresponds to bi
17ae0 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f  t 0 etc.)..*/.vo
17af0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
17b00 6c 65 74 65 41 75 78 44 61 74 61 28 73 71 6c 69  leteAuxData(sqli
17b10 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61 74 61  te3 *db, AuxData
17b20 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20   **pp, int iOp, 
17b30 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69  int mask){.  whi
17b40 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41  le( *pp ){.    A
17b50 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a  uxData *pAux = *
17b60 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70  pp;.    if( (iOp
17b70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75  <0).     || (pAu
17b80 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20  x->iAuxOp==iOp. 
17b90 20 20 20 20 20 20 20 20 20 26 26 20 70 41 75 78           && pAux
17ba0 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20 20 20  ->iAuxArg>=0.   
17bb0 20 20 20 20 20 20 20 26 26 20 28 70 41 75 78 2d         && (pAux-
17bc0 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c 20 21  >iAuxArg>31 || !
17bd0 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
17be0 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 29  2(pAux->iAuxArg)
17bf0 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
17c00 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
17c10 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a  >iAuxArg==31 );.
17c20 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
17c30 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a 20 20  xDeleteAux ){.  
17c40 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
17c50 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70 41 75  eteAux(pAux->pAu
17c60 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
17c70 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
17c80 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20 73 71  extAux;.      sq
17c90 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17ca0 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
17cb0 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
17cc0 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20  x->pNextAux;.   
17cd0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
17ce0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
17cf0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17d00 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
17d10 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
17d20 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70  gument,.** excep
17d30 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73  t for object its
17d40 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72  elf, which is pr
17d50 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eserved..**.** T
17d60 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
17d70 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
17d80 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56  ion and sqlite3V
17d90 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74  dbeDelete() is t
17da0 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74  hat.** VdbeDelet
17db0 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73  e() also unlinks
17dc0 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
17dd0 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61  he list of VMs a
17de0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
17df0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
17e00 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72  onnection and fr
17e10 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ees the object i
17e20 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tself..*/.void s
17e30 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
17e40 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
17e50 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53  b, Vdbe *p){.  S
17e60 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c  ubProgram *pSub,
17e70 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72   *pNext;.  asser
17e80 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
17e90 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
17ea0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
17eb0 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
17ec0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
17ed0 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
17ee0 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
17ef0 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
17f00 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
17f10 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
17f20 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
17f30 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
17f40 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
17f50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
17f60 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ub);.  }.  if( p
17f70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
17f80 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
17f90 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
17fa0 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
17fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
17fc0 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69  Free(db, p->pVLi
17fd0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
17fe0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
17ff0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65  ree);.  }.  vdbe
18000 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
18010 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
18020 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
18030 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
18040 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
18050 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
18060 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18070 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
18080 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e  TATUS.  {.    in
18090 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
180a0 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b  ; i<p->nScan; i+
180b0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
180c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
180d0 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
180e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
180f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
18100 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Scan);.  }.#endi
18110 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
18120 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
18130 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18140 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
18150 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
18160 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *db;..  assert( 
18170 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
18180 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
18190 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
181a0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
181b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
181c0 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
181d0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
181e0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
181f0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
18200 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
18210 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
18220 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
18230 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
18240 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
18250 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
18260 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
18270 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
18280 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
18290 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
182a0 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
182b0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
182c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
182d0 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
182e0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
182f0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
18300 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
18310 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
18320 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
18330 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
18340 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
18350 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
18360 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
18370 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
18380 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
18390 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
183a0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
183b0 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
183c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
183d0 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
183e0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
183f0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
18400 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
18410 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
18420 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
18430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
18440 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
18450 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
18460 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
18470 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
18480 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
18490 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
184a0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
184b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
184c0 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
184d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
184e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
184f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
18500 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
18510 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
18520 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
18530 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
18540 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
18550 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
18560 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18570 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
18580 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
18590 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
185a0 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
185b0 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
185c0 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
185d0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
185e0 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
185f0 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
18600 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
18610 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
18620 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
18630 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
18640 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
18650 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
18660 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
18670 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
18680 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
18690 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
186a0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
186b0 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
186c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
186d0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
186e0 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
186f0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
18700 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
18710 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
18720 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
18730 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
18740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
18750 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
18760 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18770 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
18780 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
18790 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
187a0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
187b0 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
187c0 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
187d0 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
187e0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
187f0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
18800 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
18810 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
18820 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18830 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
18840 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
18850 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
18860 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
18870 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
18880 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
18890 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
188a0 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
188b0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
188c0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
188d0 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
188e0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
188f0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
18900 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
18910 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
18920 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
18930 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
18940 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
18950 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
18960 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18970 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18980 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
18990 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
189a0 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
189b0 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
189c0 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
189d0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
189e0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
189f0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
18a00 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
18a10 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
18a20 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
18a30 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
18a40 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
18a50 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
18a60 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
18a70 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
18a80 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
18a90 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
18aa0 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
18ab0 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
18ac0 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
18ad0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
18ae0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
18af0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
18b00 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
18b10 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
18b20 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
18b30 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
18b40 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
18b50 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
18b60 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
18b70 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
18b80 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
18b90 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
18ba0 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
18bb0 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
18bc0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18bd0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
18be0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
18bf0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
18c00 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
18c10 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
18c20 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74   = *pp;.  assert
18c30 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
18c40 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20  URTYPE_BTREE || 
18c50 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
18c60 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20  TYPE_PSEUDO );. 
18c70 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
18c80 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
18c90 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20  t iMap;.    if( 
18ca0 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69  p->aAltMap && (i
18cb0 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70  Map = p->aAltMap
18cc0 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b  [1+*piCol])>0 ){
18cd0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
18ce0 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  pAltCursor;.    
18cf0 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20    *piCol = iMap 
18d00 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  - 1;.      retur
18d10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18d20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61   }.    return ha
18d30 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
18d40 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  to(p);.  }.  if(
18d50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
18d60 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
18d70 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
18d80 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
18d90 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
18da0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18db0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18dc0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
18dd0 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
18de0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18df0 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
18e00 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
18e10 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
18e20 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
18e30 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
18e40 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
18e50 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18e60 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
18e70 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
18e80 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
18e90 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
18ea0 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
18eb0 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
18ec0 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
18ed0 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
18ee0 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
18ef0 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
18f00 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
18f10 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
18f20 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
18f30 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
18f40 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
18f50 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
18f60 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
18f70 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
18f80 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
18f90 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
18fa0 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
18fb0 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
18fc0 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
18fd0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
18fe0 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
18ff0 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
19000 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19010 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
19020 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
19030 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
19040 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
19050 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
19060 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
19070 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
19080 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
19090 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a   separately..**.
190a0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
190b0 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
190c0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
190d0 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
190e0 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
190f0 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
19100 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
19110 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
19120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
19130 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
19140 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
19150 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19180 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191a0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
191b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
191c0 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
191e0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
191f0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
19200 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
19210 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
19220 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
19230 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
19260 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
19270 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
19280 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
19290 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
192a0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
192d0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
192e0 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
19300 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
19310 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
19340 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
19350 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19380 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
19390 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
193c0 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
193d0 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
193e0 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
193f0 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
19400 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
19410 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
19420 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
19430 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
19440 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
19450 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
19460 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
19470 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
19480 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
19490 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
194a0 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
194b0 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
194c0 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
194d0 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
194e0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
194f0 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
19500 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
19510 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
19520 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33   file_format, u3
19530 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20  2 *pLen){.  int 
19540 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
19550 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20  ags;.  u32 n;.. 
19560 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30   assert( pLen!=0
19570 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26   );.  if( flags&
19580 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
19590 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72  *pLen = 0;.    r
195a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
195b0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
195c0 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
195d0 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
195e0 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
195f0 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
19600 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
19610 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
19620 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
19630 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
19640 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
19650 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  ;.    if( i<0 ){
19660 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20  .      u = ~i;. 
19670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19680 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
19690 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
196a0 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d       if( (i&1)==
196b0 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
196c0 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  >=4 ){.        *
196d0 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pLen = 0;.      
196e0 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
196f0 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  u;.      }else{.
19700 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
19710 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
19720 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
19730 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
19740 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32  767 ){ *pLen = 2
19750 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20  ; return 2; }.  
19760 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
19770 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72   ){ *pLen = 3; r
19780 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69  eturn 3; }.    i
19790 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
197a0 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72   ){ *pLen = 4; r
197b0 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69  eturn 4; }.    i
197c0 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
197d0 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65  ){ *pLen = 6; re
197e0 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70  turn 5; }.    *p
197f0 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
19800 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
19810 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
19820 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38  ){.    *pLen = 8
19830 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  ;.    return 7;.
19840 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
19850 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
19860 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
19870 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
19880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
19890 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
198a0 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
198b0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
198c0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
198d0 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
198e0 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20  ;.  }.  *pLen = 
198f0 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  n;.  return ((n*
19900 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
19910 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
19920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  .}../*.** The si
19930 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74  zes for serial t
19940 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ypes less than 1
19950 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  28.*/.static con
19960 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61  st u8 sqlite3Sma
19970 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20  llTypeSizes[] = 
19980 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20  {.        /*  0 
19990 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20    1   2   3   4 
199a0 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20    5   6   7   8 
199b0 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30    9 */   ./*   0
199c0 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c   */   0,  1,  2,
199d0 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c    3,  4,  6,  8,
199e0 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    8,  0,  0,./* 
199f0 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   10 */   0,  0, 
19a00 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
19a10 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a   2,  2,  3,  3,.
19a20 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20  /*  20 */   4,  
19a30 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20  4,  5,  5,  6,  
19a40 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20  6,  7,  7,  8,  
19a50 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39  8,./*  30 */   9
19a60 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31  ,  9, 10, 10, 11
19a70 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33  , 11, 12, 12, 13
19a80 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20  , 13,./*  40 */ 
19a90 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c   14, 14, 15, 15,
19aa0 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c   16, 16, 17, 17,
19ab0 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20   18, 18,./*  50 
19ac0 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20  */  19, 19, 20, 
19ad0 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20  20, 21, 21, 22, 
19ae0 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20  22, 23, 23,./*  
19af0 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32  60 */  24, 24, 2
19b00 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32  5, 25, 26, 26, 2
19b10 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f  7, 27, 28, 28,./
19b20 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39  *  70 */  29, 29
19b30 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31  , 30, 30, 31, 31
19b40 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33  , 32, 32, 33, 33
19b50 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c  ,./*  80 */  34,
19b60 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c   34, 35, 35, 36,
19b70 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c   36, 37, 37, 38,
19b80 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20   38,./*  90 */  
19b90 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20  39, 39, 40, 40, 
19ba0 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20  41, 41, 42, 42, 
19bb0 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a  43, 43,./* 100 *
19bc0 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34  /  44, 44, 45, 4
19bd0 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34  5, 46, 46, 47, 4
19be0 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31  7, 48, 48,./* 11
19bf0 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30  0 */  49, 49, 50
19c00 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32  , 50, 51, 51, 52
19c10 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a  , 52, 53, 53,./*
19c20 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c   120 */  54, 54,
19c30 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c   55, 55, 56, 56,
19c40 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a   57, 57.};../*.*
19c50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
19c60 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
19c70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
19c80 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
19c90 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
19ca0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
19cb0 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
19cc0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
19cd0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
19ce0 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72  128 ){.    retur
19cf0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
19d00 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
19d10 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61     assert( seria
19d20 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20  l_type<12 .     
19d30 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
19d40 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
19d50 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73  serial_type]==(s
19d60 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
19d70 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  /2 );.    return
19d80 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
19d90 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
19da0 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71  pe];.  }.}.u8 sq
19db0 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65  lite3VdbeOneByte
19dc0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38  SerialTypeLen(u8
19dd0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
19de0 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
19df0 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65  type<128 );.  re
19e00 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
19e10 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
19e20 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a  l_type];  .}../*
19e30 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
19e40 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
19e50 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
19e60 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
19e70 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
19e80 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
19e90 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
19ea0 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
19eb0 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
19ec0 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
19ed0 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
19ee0 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
19ef0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
19f00 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
19f10 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
19f20 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
19f30 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
19f40 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
19f50 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
19f60 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
19f70 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
19f80 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
19f90 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
19fa0 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
19fb0 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
19fc0 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
19fd0 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
19fe0 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
19ff0 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
1a000 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
1a010 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
1a020 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
1a030 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
1a040 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
1a050 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
1a060 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
1a070 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
1a080 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
1a090 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
1a0a0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
1a0b0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
1a0c0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
1a0d0 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
1a0e0 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
1a0f0 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
1a100 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
1a110 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
1a120 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
1a130 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
1a140 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
1a150 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
1a160 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
1a170 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
1a180 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
1a190 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
1a1a0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
1a1b0 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
1a1c0 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
1a1d0 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
1a1e0 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
1a1f0 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
1a200 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
1a210 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
1a220 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
1a230 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
1a240 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
1a250 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
1a260 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
1a270 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
1a280 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
1a290 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
1a2a0 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
1a2b0 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
1a2c0 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
1a2d0 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
1a2e0 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
1a2f0 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
1a300 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
1a310 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
1a320 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
1a330 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
1a340 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
1a350 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
1a360 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
1a370 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
1a380 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
1a390 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
1a3a0 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
1a3b0 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
1a3c0 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
1a3d0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
1a3e0 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
1a3f0 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
1a400 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
1a410 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
1a420 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
1a430 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
1a440 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
1a450 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
1a460 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
1a470 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
1a480 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
1a490 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
1a4a0 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
1a4b0 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
1a4c0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
1a4d0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
1a4e0 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
1a4f0 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
1a500 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
1a510 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
1a520 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
1a530 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
1a540 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
1a550 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
1a560 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
1a570 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
1a580 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
1a590 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
1a5a0 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
1a5b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
1a5c0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1a5d0 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
1a5e0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
1a5f0 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
1a600 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
1a610 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
1a620 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
1a630 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1a640 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1a650 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
1a660 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
1a670 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1a680 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1a690 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
1a6a0 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
1a6b0 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
1a6c0 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  f[].  The caller
1a6d0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a   is responsible.
1a6e0 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e  ** for allocatin
1a6f0 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  g enough space t
1a700 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20  o buf[] to hold 
1a710 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
1a720 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f  , exclusive.** o
1a730 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  f the pMem->u.nZ
1a740 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20  ero bytes for a 
1a750 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a  MEM_Zero value..
1a760 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1a770 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a780 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
1a790 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
1a7a0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
1a7b0 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
1a7c0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
1a7d0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
1a7e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
1a7f0 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
1a800 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
1a810 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
1a820 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1a830 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
1a840 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20   Mem *pMem, u32 
1a850 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
1a860 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
1a870 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
1a880 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
1a890 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
1a8a0 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
1a8b0 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
1a8c0 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
1a8d0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1a8e0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1a8f0 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
1a900 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20  ->u.r) );.      
1a910 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
1a920 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29  ->u.r, sizeof(v)
1a930 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
1a940 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
1a950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a960 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
1a970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
1a980 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  = i = sqlite3Sma
1a990 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1a9a0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73  al_type];.    as
1a9b0 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
1a9c0 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
1a9d0 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
1a9e0 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
1a9f0 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
1aa00 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
1aa10 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
1aa20 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
1aa30 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1aa40 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
1aa50 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
1aa60 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1aa70 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
1aa80 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
1aa90 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
1aaa0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1aab0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1aac0 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
1aad0 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69  = pMem->n;.    i
1aae0 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70  f( len>0 ) memcp
1aaf0 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
1ab00 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
1ab10 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
1ab20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
1ab30 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
1ab40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
1ab50 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
1ab60 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
1ab70 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
1ab80 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
1ab90 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1aba0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
1abb0 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
1abc0 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
1abd0 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
1abe0 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
1abf0 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
1ac00 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
1ac10 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
1ac20 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
1ac30 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
1ac40 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
1ac50 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
1ac60 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
1ac70 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
1ac80 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
1ac90 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
1aca0 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
1acb0 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65  <<8)|(x)[3]).#de
1acc0 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49  fine FOUR_BYTE_I
1acd0 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a  NT(x) (16777216*
1ace0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
1acf0 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
1ad00 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f  ]<<8)|(x)[3])../
1ad10 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
1ad20 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
1ad30 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
1ad40 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
1ad50 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
1ad60 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1ad70 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
1ad80 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1ad90 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
1ada0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1adb0 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1adc0 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74  d as two separat
1add0 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  e routines for p
1ade0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
1adf0 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61  he few cases tha
1ae00 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20  t require local 
1ae10 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72  variables are br
1ae20 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20  oken out into a 
1ae30 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74  separate.** rout
1ae40 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d  ine so that in m
1ae50 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76  ost cases the ov
1ae60 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67  erhead of moving
1ae70 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74   the stack point
1ae80 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64  er.** is avoided
1ae90 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32  ..*/ .static u32
1aea0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1aeb0 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f   serialGet(.  co
1aec0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1aed0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
1aee0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
1aef0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
1af00 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
1af30 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
1af40 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af60 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
1af70 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
1af80 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d   */.){.  u64 x =
1af90 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1afa0 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20  buf);.  u32 y = 
1afb0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1afc0 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c  uf+4);.  x = (x<
1afd0 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20  <32) + y;.  if( 
1afe0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
1aff0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
1b000 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32  E-OF: R-29851-52
1b010 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62  272 Value is a b
1b020 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74  ig-endian 64-bit
1b030 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d  .    ** twos-com
1b040 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1b050 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e   */.    pMem->u.
1b060 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
1b070 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1b080 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65   MEM_Int;.    te
1b090 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1b0a0 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i<0 );.  }else{.
1b0b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1b0c0 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31  OF: R-57343-4911
1b0d0 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1b0e0 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34  -endian IEEE 754
1b0f0 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20  -2008 64-bit.   
1b100 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
1b110 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69  nt number. */.#i
1b120 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1b130 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
1b140 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1b150 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f  ING_POINT).    /
1b160 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
1b170 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
1b180 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
1b190 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
1b1a0 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
1b1b0 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
1b1c0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
1b1d0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
1b1e0 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  .    ** defined 
1b1f0 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
1b200 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1b210 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
1b220 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  ed.    ** endian
1b230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
1b240 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
1b250 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
1b260 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74  000)<<32;.    st
1b270 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
1b280 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
1b290 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
1b2a0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1b2b0 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61  Float(t2);.    a
1b2c0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
1b2d0 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
1b2e0 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
1b2f0 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
1b300 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61   );.#endif.    a
1b310 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
1b320 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
1b330 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20  em->u.r)==8 );. 
1b340 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
1b350 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
1b360 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e  memcpy(&pMem->u.
1b370 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
1b380 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
1b390 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
1b3a0 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d  N(pMem->u.r) ? M
1b3b0 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
1b3c0 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  al;.  }.  return
1b3d0 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65   8;.}.u32 sqlite
1b3e0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
1b3f0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1b400 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
1b410 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
1b420 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
1b430 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
1b440 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1b450 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
1b460 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
1b470 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
1b4a0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
1b4b0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
1b4c0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1b4d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
1b4e0 20 7b 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75   { /* Internal u
1b4f0 73 65 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69  se only: NULL wi
1b500 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
1b510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b520 2a 2a 20 55 50 44 41 54 45 20 6e 6f 2d 63 68 61  ** UPDATE no-cha
1b530 6e 67 65 20 66 6c 61 67 20 73 65 74 20 2a 2f 0a  nge flag set */.
1b540 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1b550 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  s = MEM_Null|MEM
1b560 5f 5a 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d 65  _Zero;.      pMe
1b570 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
1b580 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20  pMem->u.nZero = 
1b590 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1b5a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1b5b0 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
1b5c0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
1b5d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
1b5e0 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
1b5f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1b600 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
1b610 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
1b620 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1b630 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
1b640 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
1b650 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1b660 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1b670 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
1b680 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
1b690 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
1b6a0 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
1b6b0 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
1b6c0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1b6d0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
1b6e0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1b6f0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1b700 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b710 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1b720 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1b730 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1b740 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1b750 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1b760 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1b770 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
1b780 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
1b790 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
1b7a0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1b7b0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1b7c0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1b7d0 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
1b7e0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1b7f0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1b800 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1b810 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1b820 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1b830 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
1b840 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1b850 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1b860 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
1b870 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1b880 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
1b890 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1b8a0 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
1b8b0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1b8c0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1b8d0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
1b8e0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
1b8f0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1b900 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1b910 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b920 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1b930 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
1b940 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1b950 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1b960 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1b970 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1b980 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
1b990 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
1b9a0 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
1b9b0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1b9c0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1b9d0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1b9e0 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1b9f0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64  E_INT(buf);.#ifd
1ba00 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20  ef __HP_cc .    
1ba10 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
1ba20 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f   a sign-extensio
1ba30 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20  n bug in the HP 
1ba40 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f  compiler for HP/
1ba50 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  UX */.      if( 
1ba60 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d  buf[0]&0x80 ) pM
1ba70 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66  em->u.i |= 0xfff
1ba80 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b  fffff80000000LL;
1ba90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d  .#endif.      pM
1baa0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1bab0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1bac0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1bad0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1bae0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
1baf0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1bb00 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1bb10 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1bb20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
1bb30 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
1bb40 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
1bb50 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1bb60 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1bb70 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1bb80 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1bb90 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
1bba0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1bbb0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1bbc0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1bbd0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1bbe0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1bbf0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1bc00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
1bc10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bc20 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
1bc30 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1bc40 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
1bc50 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
1bc60 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
1bc70 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
1bc80 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
1bc90 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
1bca0 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
1bcb0 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
1bcc0 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
1bcd0 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
1bce0 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
1bcf0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
1bd00 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
1bd10 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
1bd20 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
1bd30 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
1bd40 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
1bd50 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
1bd60 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
1bd70 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1bd80 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
1bd90 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1bda0 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
1bdb0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1bdc0 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
1bdd0 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1bde0 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
1bdf0 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
1be00 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
1be10 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1be20 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
1be30 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1be40 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1be50 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1be60 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
1be70 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
1be80 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
1be90 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
1bea0 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
1beb0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1bec0 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
1bed0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1bee0 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
1bef0 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
1bf00 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
1bf10 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
1bf20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1bf30 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
1bf40 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
1bf50 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
1bf60 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
1bf70 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
1bf80 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
1bf90 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
1bfa0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
1bfb0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1bfc0 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
1bfd0 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
1bfe0 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
1bff0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1c000 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
1c010 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
1c020 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
1c030 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
1c040 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
1c050 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
1c060 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
1c070 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
1c080 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1c090 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
1c0a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1c0b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
1c0c0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1c0d0 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
1c0e0 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
1c0f0 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
1c100 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
1c110 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
1c120 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
1c130 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
1c140 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
1c150 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
1c160 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
1c170 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
1c180 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
1c190 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
1c1a0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
1c1b0 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
1c1c0 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
1c1d0 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
1c1e0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1c1f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
1c200 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
1c210 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
1c220 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
1c230 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
1c240 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1c250 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
1c260 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1c270 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
1c280 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1c290 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
1c2a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
1c2b0 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
1c2c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
1c2d0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c2e0 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fo              
1c2f0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1c300 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
1c310 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1c320 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1c330 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1c340 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1c350 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  rn */.  int nByt
1c360 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c370 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c380 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1c390 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20  red for *p */.  
1c3a0 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1c3b0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1c3c0 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1c3d0 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
1c3e0 6e 4b 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20  nKeyField+1);.  
1c3f0 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1c400 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
1c410 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
1c420 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
1c430 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1c440 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   0;.  p->aMem = 
1c450 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
1c460 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
1c470 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1c480 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
1c490 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1c4a0 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
1c4b0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1c4c0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1c4d0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1c4e0 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
1c4f0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
1c500 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
1c510 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
1c520 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
1c530 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
1c540 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
1c550 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
1c560 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
1c570 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
1c580 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
1c590 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
1c5a0 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
1c5b0 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
1c5c0 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
1c5d0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1c5e0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1c5f0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
1c600 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
1c610 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
1c620 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c630 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
1c640 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
1c650 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1c660 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
1c670 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
1c680 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
1c690 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1c6a0 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
1c6b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1c6c0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1c6d0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1c6e0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1c6f0 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
1c700 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
1c710 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1c720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1c730 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
1c740 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1c750 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1c780 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
1c790 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
1c7a0 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
1c7b0 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
1c7c0 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
1c7d0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1c7e0 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
1c7f0 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1c800 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1c810 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
1c820 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
1c830 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
1c840 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
1c850 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1c860 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1c870 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
1c880 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1c890 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
1c8a0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1c8b0 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
1c8c0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
1c8d0 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
1c8e0 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
1c8f0 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
1c900 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
1c910 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
1c920 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
1c930 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
1c940 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
1c950 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1c960 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
1c970 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
1c980 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
1c990 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
1c9a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73   break;.  }.  as
1c9b0 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
1c9c0 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31  o->nKeyField + 1
1c9d0 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
1c9e0 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = u;.}..#ifdef S
1c9f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1ca00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ca10 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
1ca20 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
1ca30 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
1ca40 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
1ca50 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
1ca60 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
1ca70 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
1ca80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1ca90 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1caa0 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
1cab0 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
1cac0 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
1cad0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1cae0 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
1caf0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
1cb00 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
1cb10 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
1cb20 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1cb30 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1cb40 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
1cb50 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
1cb60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1cb70 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
1cb80 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
1cb90 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
1cba0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1cbb0 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
1cbc0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
1cbd0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
1cbe0 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
1cbf0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
1cc00 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
1cc10 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
1cc20 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1cc30 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
1cc40 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1cc50 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1cc60 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
1cc70 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
1cc80 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
1cc90 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1cca0 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ccc0 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
1ccd0 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1cce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1ccf0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1cd00 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1cd10 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
1cd20 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
1cd30 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1cd40 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
1cd50 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
1cd60 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1cd70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1cd80 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
1cd90 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
1cda0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
1cdb0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1cdc0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1cdd0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1cde0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
1cdf0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1ce00 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
1ce10 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1ce20 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
1ce30 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
1ce40 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1ce50 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1ce60 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
1ce70 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1ce80 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
1ce90 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
1cea0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1ceb0 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
1cec0 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
1ced0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1cee0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1cef0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1cf00 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1cf10 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
1cf20 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
1cf30 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
1cf40 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
1cf50 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1cf60 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
1cf70 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
1cf80 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
1cf90 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
1cfa0 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
1cfb0 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
1cfc0 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
1cfd0 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
1cfe0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
1cff0 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
1d000 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
1d010 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
1d020 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
1d030 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
1d040 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
1d050 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
1d060 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
1d070 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
1d080 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
1d090 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
1d0a0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1d0b0 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
1d0c0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
1d0d0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
1d0e0 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
1d0f0 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
1d100 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
1d110 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
1d120 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
1d130 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1d140 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1d150 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30   if( szHdr1>9830
1d160 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  7 ) return SQLIT
1d170 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20  E_CORRUPT;.  d1 
1d180 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
1d190 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  rt( pKeyInfo->nA
1d1a0 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  llField>=pPKey2-
1d1b0 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
1d1c0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1d1d0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1d1e0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1d1f0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1d200 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b  ->nKeyField>0 );
1d210 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1d220 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1d230 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1d240 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1d250 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
1d260 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
1d270 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
1d280 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
1d290 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
1d2a0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1d2b0 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
1d2c0 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20  ial_type1 );..  
1d2d0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1d2e0 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
1d2f0 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69   key space remai
1d300 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20  ning to avoid.  
1d310 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
1d320 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31  erread.  The "d1
1d330 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22  +serial_type1+2"
1d340 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77   subexpression w
1d350 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  ill.    ** alway
1d360 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  s be greater tha
1d370 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1d380 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75  e amount of requ
1d390 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a  ired key space..
1d3a0 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20      ** Use that 
1d3b0 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f  approximation to
1d3c0 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20   avoid the more 
1d3d0 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74  expensive call t
1d3e0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
1d3f0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1d400 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  n() in the commo
1d410 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  n case..    */. 
1d420 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c     if( d1+serial
1d430 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b  _type1+2>(u32)nK
1d440 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73  ey1.     && d1+s
1d450 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1d460 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1d470 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31  ype1)>(u32)nKey1
1d480 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62   .    ){.      b
1d490 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1d4a0 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1d4b0 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
1d4c0 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
1d4d0 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1d4e0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1d4f0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1d500 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
1d510 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
1d520 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
1d530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d540 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
1d550 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
1d560 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i], pKeyInfo->aC
1d570 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  oll[i]);.    if(
1d580 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1d590 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1d5a0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1d5b0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1d5c0 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
1d5d0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1d5e0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1d5f0 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
1d600 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
1d610 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
1d620 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
1d630 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62  }.      goto deb
1d640 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20  ugCompareEnd;.  
1d650 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
1d660 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
1d670 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1d680 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
1d690 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1d6a0 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1d6b0 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1d6c0 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1d6d0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1d6e0 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1d6f0 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1d700 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1d710 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1d720 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1d730 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1d740 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1d750 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1d760 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1d770 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1d780 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1d790 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
1d7a0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1d7b0 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1d7c0 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1d7d0 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1d7e0 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1d7f0 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1d800 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1d810 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65   rc = pPKey2->de
1d820 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67  fault_rc;..debug
1d830 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66  CompareEnd:.  if
1d840 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d  ( desiredResult=
1d850 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65  =0 && rc==0 ) re
1d860 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1d870 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26  siredResult<0 &&
1d880 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31   rc<0 ) return 1
1d890 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1d8a0 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20  esult>0 && rc>0 
1d8b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1d8c0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1d8d0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1d8e0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1d8f0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1d900 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
1d910 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
1d920 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d930 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1d940 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1d950 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73   (a.k.a. columns
1d960 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  ) in the record 
1d970 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79  given by.** pKey
1d980 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69  ,nKey.  The veri
1d990 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75  fy that this cou
1d9a0 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  nt is less than 
1d9b0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a  or equal to the.
1d9c0 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62  ** limit given b
1d9d0 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  y pKeyInfo->nAll
1d9e0 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Field..**.** If 
1d9f0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
1da00 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
1da10 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1da20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  the high-speed.*
1da30 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  * vdbeRecordComp
1da40 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62  areInt() and vdb
1da50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1da60 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20  ring() routines 
1da70 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
1da80 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20   correctly.  If 
1da90 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76  this assert() ev
1daa0 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f  er fires, it pro
1dab0 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74  bably means.** t
1dac0 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e  hat the KeyInfo.
1dad0 6e 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b 65 79  nKeyField or Key
1dae0 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76  Info.nAllField v
1daf0 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75  alues were compu
1db00 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74  ted.** incorrect
1db10 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1db20 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65  id vdbeAssertFie
1db30 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1db40 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  its(.  int nKey,
1db50 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1db60 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f  y,   /* The reco
1db70 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20  rd to verify */ 
1db80 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f  .  const KeyInfo
1db90 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20   *pKeyInfo      
1dba0 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65   /* Compare size
1dbb0 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e   with this KeyIn
1dbc0 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  fo */.){.  int n
1dbd0 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32  Field = 0;.  u32
1dbe0 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64   szHdr;.  u32 id
1dbf0 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64  x;.  u32 notUsed
1dc00 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1dc10 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1dc20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1dc30 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69  char*)pKey;..  i
1dc40 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1dc50 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20  return;.  idx = 
1dc60 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1dc70 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65  , szHdr);.  asse
1dc80 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20  rt( nKey>=0 );. 
1dc90 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d   assert( szHdr<=
1dca0 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77  (u32)nKey );.  w
1dcb0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
1dcc0 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ){.    idx += ge
1dcd0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69  tVarint32(aKey+i
1dce0 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20  dx, notUsed);.  
1dcf0 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a    nField++;.  }.
1dd00 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
1dd10 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41   <= pKeyInfo->nA
1dd20 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c  llField );.}.#el
1dd30 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
1dd40 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1dd50 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42  WithinLimits(A,B
1dd60 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,C).#endif../*.*
1dd70 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e  * Both *pMem1 an
1dd80 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e  d *pMem2 contain
1dd90 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20   string values. 
1dda0 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20  Compare the two 
1ddb0 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20  values.** using 
1ddc0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1ddd0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73  quence pColl. As
1dde0 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61   usual, return a
1ddf0 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f   negative , zero
1de00 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1de10 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20  value if *pMem1 
1de20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1de30 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65  ual to or greate
1de40 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d  r than .** *pMem
1de50 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  2, respectively.
1de60 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72   Similar in spir
1de70 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d  it to "rc = (*pM
1de80 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b  em1) - (*pMem2);
1de90 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1dea0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1deb0 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d  tring(.  const M
1dec0 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e  em *pMem1,.  con
1ded0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20  st Mem *pMem2,. 
1dee0 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1def0 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63  pColl,.  u8 *prc
1df00 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1df10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1df20 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65  n OOM occurs, se
1df30 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1df40 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d  M */.){.  if( pM
1df50 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  em1->enc==pColl-
1df60 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54  >enc ){.    /* T
1df70 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61  he strings are a
1df80 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f  lready in the co
1df90 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20  rrect encoding. 
1dfa0 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a   Call the.     *
1dfb0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * comparison fun
1dfc0 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a  ction directly *
1dfd0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f  /.    return pCo
1dfe0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1dff0 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70  pUser,pMem1->n,p
1e000 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e  Mem1->z,pMem2->n
1e010 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65  ,pMem2->z);.  }e
1e020 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
1e030 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
1e040 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65  *v1, *v2;.    Me
1e050 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32  m c1;.    Mem c2
1e060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e070 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d  eMemInit(&c1, pM
1e080 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1e090 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1e0a0 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20  dbeMemInit(&c2, 
1e0b0 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1e0c0 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1e0d0 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1e0e0 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20  opy(&c1, pMem1, 
1e0f0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1e100 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1e110 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70  allowCopy(&c2, p
1e120 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem2, MEM_Ephem)
1e130 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74  ;.    v1 = sqlit
1e140 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1e150 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c  ite3_value*)&c1,
1e160 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1e170 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
1e180 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1e190 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
1e1a0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66  ll->enc);.    if
1e1b0 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d  ( (v1==0 || v2==
1e1c0 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0) ){.      if( 
1e1d0 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72  prcErr ) *prcErr
1e1e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1e1f0 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d  BKPT;.      rc =
1e200 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1e210 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d       rc = pColl-
1e220 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1e230 65 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32  er, c1.n, v1, c2
1e240 2e 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20  .n, v2);.    }. 
1e250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e260 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20  mRelease(&c1);. 
1e270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e280 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20  mRelease(&c2);. 
1e290 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e2a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  }.}../*.** The i
1e2b0 6e 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75  nput pBlob is gu
1e2c0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1e2d0 20 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f   Blob that is no
1e2e0 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68  t marked.** with
1e2f0 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75   MEM_Zero.  Retu
1e300 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 6f  rn true if it co
1e310 75 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c  uld be a zero-bl
1e320 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ob..*/.static in
1e330 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73  t isAllZero(cons
1e340 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1e350 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1e360 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1e370 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29  {.    if( z[i] )
1e380 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1e390 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1e3a0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1e3b0 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1e3c0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1e3d0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1e3e0 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1e3f0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1e400 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1e410 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1e420 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1e430 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1e440 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1e450 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1e460 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1e470 73 73 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f  ssor..*/.SQLITE_
1e480 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c  NOINLINE int sql
1e490 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1e4a0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20  const Mem *pB1, 
1e4b0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b  const Mem *pB2){
1e4c0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1e4d0 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69  n1 = pB1->n;.  i
1e4e0 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a  nt n2 = pB2->n;.
1e4f0 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73  .  /* It is poss
1e500 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42  ible to have a B
1e510 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68  lob value that h
1e520 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f  as some non-zero
1e530 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f   content.  ** fo
1e540 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63  llowed by zero c
1e550 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61  ontent.  But tha
1e560 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20  t only comes up 
1e570 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64  for Blobs formed
1e580 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f  .  ** by the OP_
1e590 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1e5a0 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62  e, and such Blob
1e5b0 73 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73  s never get pass
1e5c0 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
1e5d0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1e5e0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
1e5f0 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB1->flags & MEM
1e600 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d  _Zero)==0 || n1=
1e610 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1e620 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  (pB2->flags & ME
1e630 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32  M_Zero)==0 || n2
1e640 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70  ==0 );..  if( (p
1e650 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66  B1->flags|pB2->f
1e660 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f  lags) & MEM_Zero
1e670 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d   ){.    if( pB1-
1e680 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c  >flags & pB2->fl
1e690 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1e6a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1e6b0 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42  B1->u.nZero - pB
1e6c0 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  2->u.nZero;.    
1e6d0 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66  }else if( pB1->f
1e6e0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1e6f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
1e700 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20  AllZero(pB2->z, 
1e710 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e  pB2->n) ) return
1e720 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1e730 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d  n pB1->u.nZero -
1e740 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n2;.    }else{.
1e750 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c        if( !isAll
1e760 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31  Zero(pB1->z, pB1
1e770 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31  ->n) ) return +1
1e780 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  ;.      return n
1e790 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f  1 - pB2->u.nZero
1e7a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20  ;.    }.  }.  c 
1e7b0 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c  = memcmp(pB1->z,
1e7c0 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f   pB2->z, n1>n2 ?
1e7d0 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28   n2 : n1);.  if(
1e7e0 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20   c ) return c;. 
1e7f0 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b   return n1 - n2;
1e800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63  .}../*.** Do a c
1e810 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65  omparison betwee
1e820 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65  n a 64-bit signe
1e830 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20  d integer and a 
1e840 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d  64-bit floating-
1e850 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e  point.** number.
1e860 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1e870 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1e880 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1e890 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20  t (i64) is less 
1e8a0 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74  than,.** equal t
1e8b0 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1e8c0 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64  an the second (d
1e8d0 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  ouble)..*/.stati
1e8e0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74  c int sqlite3Int
1e8f0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34  FloatCompare(i64
1e900 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20   i, double r){. 
1e910 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47   if( sizeof(LONG
1e920 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29  DOUBLE_TYPE)>8 )
1e930 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45  {.    LONGDOUBLE
1e940 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44  _TYPE x = (LONGD
1e950 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20  OUBLE_TYPE)i;.  
1e960 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75    if( x<r ) retu
1e970 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78  rn -1;.    if( x
1e980 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1e990 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79  }else{.    i64 y
1e9b0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a  ;.    double s;.
1e9c0 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33      if( r<-92233
1e9d0 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30  72036854775808.0
1e9e0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1e9f0 20 20 69 66 28 20 72 3e 3d 39 32 32 33 33 37 32    if( r>=9223372
1ea00 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29  036854775808.0 )
1ea10 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1ea20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20  y = (i64)r;.    
1ea30 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e  if( i<y ) return
1ea40 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79   -1;.    if( i>y
1ea50 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ea60 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b    s = (double)i;
1ea70 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72  .    if( s<r ) r
1ea80 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1ea90 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( s>r ) return +
1eaa0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1eab0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1eac0 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
1ead0 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68   contained by th
1eae0 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  e two memory cel
1eaf0 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  ls, returning.**
1eb00 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20   negative, zero 
1eb10 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1eb20 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1eb30 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1eb40 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20  greater.** than 
1eb50 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f  pMem2. Sorting o
1eb60 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66  rder is NULL's f
1eb70 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  irst, followed b
1eb80 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67  y numbers (integ
1eb90 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73  ers.** and reals
1eba0 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63  ) sorted numeric
1ebb0 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  ally, followed b
1ebc0 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62  y text ordered b
1ebd0 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  y the collating.
1ebe0 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ** sequence pCol
1ebf0 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c  l and finally bl
1ec00 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20  ob's ordered by 
1ec10 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  memcmp()..**.** 
1ec20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  Two NULL values 
1ec30 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1ec40 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e  qual by this fun
1ec50 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1ec60 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1ec70 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1ec80 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  , const Mem *pMe
1ec90 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  m2, const CollSe
1eca0 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74  q *pColl){.  int
1ecb0 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63   f1, f2;.  int c
1ecc0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a  ombined_flags;..
1ecd0 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c    f1 = pMem1->fl
1ece0 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d  ags;.  f2 = pMem
1ecf0 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62  2->flags;.  comb
1ed00 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c  ined_flags = f1|
1ed10 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73  f2;.  assert( !s
1ed20 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52  qlite3VdbeMemIsR
1ed30 6f 77 53 65 74 28 70 4d 65 6d 31 29 20 26 26 20  owSet(pMem1) && 
1ed40 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49  !sqlite3VdbeMemI
1ed50 73 52 6f 77 53 65 74 28 70 4d 65 6d 32 29 20 29  sRowSet(pMem2) )
1ed60 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  ;. .  /* If one 
1ed70 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69  value is NULL, i
1ed80 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  t is less than t
1ed90 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74  he other. If bot
1eda0 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72  h values.  ** ar
1edb0 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  e NULL, return 0
1edc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1edd0 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1ede0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
1edf0 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29  rn (f2&MEM_Null)
1ee00 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29   - (f1&MEM_Null)
1ee10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c  ;.  }..  /* At l
1ee20 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
1ee30 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20  two values is a 
1ee40 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66  number.  */.  if
1ee50 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1ee60 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
1ee70 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  al) ){.    if( (
1ee80 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1ee90 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1eea0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1eeb0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1eec0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1eed0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1eee0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1eef0 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1ef00 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1ef10 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
1ef20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1ef30 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1ef40 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r < pMem2->u.
1ef50 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1ef60 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1ef70 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r > pMem2->u.r
1ef80 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ef90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1efa0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1efb0 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1efc0 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1efd0 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1efe0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1eff0 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1f000 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70  re(pMem1->u.i, p
1f010 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem2->u.r);.    
1f020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f030 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1f040 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1f050 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
1f060 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1f070 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f2&MEM_Int)!=0 
1f080 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f090 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  n -sqlite3IntFlo
1f0a0 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d  atCompare(pMem2-
1f0b0 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72  >u.i, pMem1->u.r
1f0c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f0d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1f0e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1f0f0 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .    return +1;.
1f100 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
1f110 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
1f120 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
1f130 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
1f140 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
1f150 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
1f160 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
1f170 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
1f180 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
1f190 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1f1a0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
1f1b0 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
1f1c0 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
1f1d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f1e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1f1f0 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
1f200 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1f210 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
1f220 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1f230 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
1f240 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d   || pMem1->db->m
1f250 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1f260 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1f270 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1f280 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
1f290 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
1f2a0 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
1f2b0 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1f2c0 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
1f2d0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1f2e0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
1f2f0 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
1f300 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
1f310 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
1f320 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
1f330 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1f340 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
1f350 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
1f360 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
1f370 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
1f380 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
1f390 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1f3a0 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
1f3b0 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
1f3c0 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1f3d0 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
1f3e0 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
1f3f0 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
1f400 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
1f410 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
1f420 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
1f430 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
1f440 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
1f450 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
1f460 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
1f470 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
1f480 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
1f490 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
1f4a0 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1f4b0 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1f4c0 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ().  */.  return
1f4d0 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1f4e0 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  are(pMem1, pMem2
1f4f0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
1f500 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1f510 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1f520 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72  unction is a ser
1f530 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a  ial-type that.**
1f540 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1f550 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c  an integer - all
1f560 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1f570 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76  1 and 9 inclusiv
1f580 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20  e .** except 7. 
1f590 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74  The second point
1f5a0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
1f5b0 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65  ntaining an inte
1f5c0 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72  ger value.** ser
1f5d0 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e  ialized accordin
1f5e0 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65  g to serial_type
1f5f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1f600 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20  deserializes.** 
1f610 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1f620 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1f630 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44   i64 vdbeRecordD
1f640 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72  ecodeInt(u32 ser
1f650 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ial_type, const 
1f660 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
1f670 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   y;.  assert( CO
1f680 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72  RRUPT_DB || (ser
1f690 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73  ial_type>=1 && s
1f6a0 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26  erial_type<=9 &&
1f6b0 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29   serial_type!=7)
1f6c0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1f6d0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1f6e0 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
1f6f0 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 1:.      testc
1f700 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1f710 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1f720 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  n ONE_BYTE_INT(a
1f730 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32  Key);.    case 2
1f740 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1f750 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1f760 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1f770 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1f780 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20  );.    case 3:. 
1f790 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1f7a0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1f7b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45       return THRE
1f7c0 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1f7d0 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  ;.    case 4: {.
1f7e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f7f0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1f800 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1f810 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1f820 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1f830 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1f840 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1f850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f860 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1f870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f  .      return FO
1f880 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1f890 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1f8a0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1f8b0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  NT(aKey);.    }.
1f8c0 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1f8d0 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52      u64 x = FOUR
1f8e0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1f8f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f900 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1f910 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1f920 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1f930 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1f940 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1f950 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d  *(i64*)&x;.    }
1f960 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
1f970 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29  serial_type - 8)
1f980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f990 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1f9a0 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
1f9b0 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
1f9c0 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
1f9d0 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
1f9e0 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
1f9f0 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
1fa00 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
1fa10 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
1fa20 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
1fa30 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1fa40 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
1fa50 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
1fa60 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
1fa70 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
1fa80 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
1fa90 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1faa0 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
1fab0 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
1fac0 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
1fad0 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
1fae0 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
1faf0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
1fb00 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
1fb10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1fb20 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
1fb30 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
1fb40 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1fb50 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1fb60 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
1fb70 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
1fb80 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
1fb90 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
1fba0 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
1fbb0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
1fbc0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1fbd0 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1fbe0 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
1fbf0 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
1fc00 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
1fc10 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
1fc20 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1fc30 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
1fc40 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61  .**.** If databa
1fc50 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1fc60 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74   discovered, set
1fc70 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1fc80 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43   to .** SQLITE_C
1fc90 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72  ORRUPT and retur
1fca0 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  n 0. If an OOM e
1fcb0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1fcc0 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d  red, .** pPKey2-
1fcd0 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  >errCode is set 
1fce0 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1fcf0 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  and, if it is no
1fd00 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d  t NULL, the.** m
1fd10 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
1fd20 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73  g set on databas
1fd30 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32  e handle (pPKey2
1fd40 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e  ->pKeyInfo->db).
1fd50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1fd60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1fd70 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20  WithSkip(.  int 
1fd80 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1fd90 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1fda0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1fdb0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1fdc0 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1fdd0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1fde0 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fe00 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1fe10 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1fe20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1fe50 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1fe60 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1fe70 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1fea0 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1feb0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1fec0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fee0 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1fef0 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1ff00 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1ff30 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1ff40 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1ff50 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff70 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1ff80 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1ff90 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1ffa0 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1ffb0 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1ffc0 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1ffd0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  o *pKeyInfo;.  c
1ffe0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1fff0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
20000 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
20010 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
20020 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
20030 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
20040 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
20050 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
20060 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
20070 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
20080 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
20090 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
200a0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
200b0 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
200c0 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
200d0 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
200e0 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
200f0 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
20100 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
20110 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
20120 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
20130 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
20140 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
20150 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
20160 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
20170 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
20180 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
20190 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
201a0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
201b0 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
201c0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
201d0 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
201e0 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
201f0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
20200 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
20210 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20220 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20230 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
20240 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
20250 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
20260 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
20270 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
20280 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
20290 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
202a0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
202b0 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
202c0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
202d0 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50  o->nAllField>=pP
202e0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20  Key2->nField .  
202f0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
20300 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
20310 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
20320 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
20330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
20340 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
20350 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  KeyField>0 );.  
20360 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
20370 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
20380 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
20390 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
203a0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
203b0 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
203c0 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
203d0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
203e0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
203f0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
20400 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20410 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
20420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
20430 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
20440 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
20450 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20460 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
20470 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20480 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
20490 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
204a0 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =7 ){.        sq
204b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
204c0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
204d0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
204e0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
204f0 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
20500 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75  tCompare(pRhs->u
20510 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20  .i, mem1.u.r);. 
20520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20530 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
20540 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
20550 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
20560 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
20570 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
20580 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
20590 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
205a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
205b0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
205c0 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
205d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
205e0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
205f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20600 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
20610 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
20620 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
20630 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
20640 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
20650 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
20660 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
20670 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =10 ){.        /
20680 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31  * Serial types 1
20690 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65  2 or greater are
206a0 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
206b0 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e  bs (greater than
206c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
206d0 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61  ers). Types 10 a
206e0 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e  nd 11 are curren
206f0 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f  tly "reserved fo
20700 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20  r future .      
20710 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74    ** use", so it
20720 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20   doesn't really 
20730 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20  matter what the 
20740 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
20750 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
20760 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63  them to numberic
20770 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f   values are.  */
20780 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
20790 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
207a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
207b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
207c0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
207d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
207e0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
207f0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
20800 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
20810 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69          if( seri
20820 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
20830 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
20840 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r<pRhs->u.r )
20850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
20860 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
20870 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e   }else if( mem1.
20880 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r>pRhs->u.r ){
20890 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
208a0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = +1;.          
208b0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
208c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
208d0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
208e0 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c  ompare(mem1.u.i,
208f0 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20   pRhs->u.r);.   
20900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20910 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
20920 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   is a string */.
20930 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
20940 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  s->flags & MEM_S
20950 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  tr ){.      getV
20960 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
20970 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
20980 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
20990 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
209a0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
209b0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
209c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
209d0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
209e0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
209f0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
20a00 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
20a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20a20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72     mem1.n = (ser
20a30 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
20a40 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
20a50 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
20a60 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
20a70 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
20a80 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
20a90 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  .n+1)==(unsigned
20aa0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
20ab0 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e    if( (d1+mem1.n
20ac0 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
20ad0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
20ae0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
20af0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
20b00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20b30 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
20b40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
20b50 28 20 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  ( (pKeyInfo = pP
20b60 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d  Key2->pKeyInfo)-
20b70 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
20b80 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
20b90 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
20ba0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
20bb0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
20bc0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
20bd0 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
20be0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
20bf0 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
20c00 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
20c10 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
20c20 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
20c30 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d              &mem
20c40 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
20c50 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50  o->aColl[i], &pP
20c60 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20  Key2->errCode.  
20c70 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
20c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20c90 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
20ca0 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d  IN(mem1.n, pRhs-
20cb0 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
20cc0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
20cd0 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
20ce0 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
20cf0 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
20d00 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d  = mem1.n - pRhs-
20d10 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  >n; .        }. 
20d20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20d30 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c    /* RHS is a bl
20d40 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ob */.    else i
20d50 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
20d60 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20   MEM_Blob ){.   
20d70 20 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73     assert( (pRhs
20d80 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
20d90 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  ro)==0 || pRhs->
20da0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65  n==0 );.      ge
20db0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
20dc0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
20dd0 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
20de0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
20df0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
20e00 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
20e10 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
20e20 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
20e30 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
20e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20e50 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
20e60 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
20e70 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
20e80 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
20e90 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
20ea0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
20eb0 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
20ec0 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
20ed0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
20ee0 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
20ef0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
20f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
20f10 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
20f20 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
20f30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
20f40 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
20f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
20f60 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
20f70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
20f80 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
20f90 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Zero ){.        
20fa0 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
20fb0 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61  ((const char*)&a
20fc0 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29  Key1[d1],nStr) )
20fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
20fe0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
20ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21000 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70     rc = nStr - p
21010 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Rhs->u.nZero;.  
21020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21040 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
21050 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
21060 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21070 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
21080 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
21090 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
210a0 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
210b0 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
210c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
210d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
210e0 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
210f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
21100 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
21110 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
21120 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
21130 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
21140 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
21150 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e      if( pPKey2->
21160 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
21170 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
21180 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
21190 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
211a0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
211b0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
211c0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
211d0 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
211e0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
211f0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
21200 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
21210 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
21220 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
21230 2b 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 50  +;.    if( i==pP
21240 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62  Key2->nField ) b
21250 72 65 61 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b  reak;.    pRhs++
21260 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
21270 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
21280 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
21290 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
212a0 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
212b0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
212c0 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
212d0 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
212e0 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e   d1<=(unsigned)n
212f0 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  Key1 );..  /* No
21300 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
21310 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
21320 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
21330 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
21340 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
21350 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
21360 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
21370 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
21380 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
21390 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
213a0 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
213b0 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
213c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
213d0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
213e0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
213f0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
21400 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
21410 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
21420 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
21430 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
21440 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
21450 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
21460 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
21470 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
21480 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f   */.  assert( CO
21490 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20  RRUPT_DB .      
214a0 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f   || vdbeRecordCo
214b0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
214c0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
214d0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
214e0 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  _rc) .       || 
214f0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
21500 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
21510 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32  ed.  );.  pPKey2
21520 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
21530 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
21540 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74  efault_rc;.}.int
21550 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21560 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
21570 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
21580 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
21590 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
215a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
215b0 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a  Key2          /*
215c0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
215d0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
215e0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
215f0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
21600 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
21610 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   0);.}.../*.** T
21620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21630 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
21640 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
21650 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21660 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
21670 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
21680 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
21690 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
216a0 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
216b0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
216c0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
216d0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
216e0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
216f0 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
21700 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
21710 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f  *.** To avoid co
21720 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66  ncerns about buf
21730 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74  fer overreads, t
21740 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
21750 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73  nly used.** on s
21760 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65  chemas where the
21770 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68   maximum valid h
21780 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33  eader size is 63
21790 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a   bytes or less..
217a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
217b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
217c0 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  nt(.  int nKey1,
217d0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
217e0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
217f0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
21800 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
21810 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
21820 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
21830 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
21840 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
21850 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
21860 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
21870 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
21880 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
21890 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
218a0 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
218b0 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c    i64 v;.  i64 l
218c0 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  hs;..  vdbeAsser
218d0 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
218e0 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
218f0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
21900 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eyInfo);.  asser
21910 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
21920 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
21930 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
21940 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
21950 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
21960 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
21970 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
21980 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
21990 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
219a0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
219b0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
219c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
219d0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
219e0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
219f0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
21a00 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
21a10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21a20 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
21a30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21a40 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
21a50 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
21a60 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
21a70 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
21a80 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
21a90 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
21aa0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21ab0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
21ac0 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
21ad0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
21ae0 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
21af0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
21b00 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
21b10 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
21b20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
21b30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21b40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21b50 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
21b60 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
21b70 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
21b80 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
21b90 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
21ba0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
21bb0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
21bc0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
21bd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21be0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
21bf0 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
21c00 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
21c10 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
21c20 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
21c30 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
21c40 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
21c50 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
21c60 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
21c70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21c80 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
21c90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21ca0 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
21cb0 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
21cc0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
21cd0 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
21ce0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
21cf0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
21d00 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
21d10 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
21d20 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
21d30 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
21d40 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
21d50 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
21d60 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
21d70 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
21d80 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
21d90 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
21da0 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
21db0 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
21dc0 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
21dd0 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
21de0 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
21df0 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
21e00 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
21e10 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
21e20 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
21e30 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
21e40 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
21e50 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
21e60 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
21e70 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
21e80 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
21e90 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
21ea0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
21eb0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21ec0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21ed0 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66  PKey2);..    def
21ee0 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
21ef0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
21f00 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
21f10 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21f20 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50  );.  }..  v = pP
21f30 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e  Key2->aMem[0].u.
21f40 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  i;.  if( v>lhs )
21f50 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
21f60 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
21f70 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
21f80 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21f90 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
21fa0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
21fb0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
21fc0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
21fd0 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
21fe0 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
21ff0 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
22000 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
22010 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
22020 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22030 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
22040 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
22050 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
22060 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
22070 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
22080 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
22090 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
220a0 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
220b0 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
220c0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
220d0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
220e0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
220f0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
22100 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
22110 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
22120 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
22130 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
22140 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22150 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
22160 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
22170 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22180 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
22190 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
221a0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
221b0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
221c0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
221d0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
221e0 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
221f0 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
22200 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
22210 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
22220 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
22230 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
22240 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
22250 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
22260 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
22270 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
22280 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
22290 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
222a0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
222b0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
222c0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
222d0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
222e0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
222f0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
22300 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
22310 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
22320 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
22330 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
22340 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
22350 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
22360 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
22370 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
22380 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
22390 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
223a0 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
223b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
223c0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
223d0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
223e0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
223f0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
22400 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
22410 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
22420 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
22430 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
22440 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
22450 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
22460 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
22470 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
22480 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
22490 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
224a0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
224b0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
224c0 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
224d0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
224e0 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
224f0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
22500 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
22510 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
22520 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
22530 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
22540 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
22550 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
22570 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
22580 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
22590 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
225a0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
225b0 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
225c0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
225d0 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
225e0 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
225f0 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
22600 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
22610 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
22620 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
22630 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
22640 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
22650 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
22660 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
22670 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22680 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
22690 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
226a0 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
226b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
226c0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
226d0 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
226e0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53       pPKey2->eqS
226f0 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
22700 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
22710 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
22720 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
22730 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
22740 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
22750 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
22760 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
22770 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
22780 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22790 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
227a0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
227b0 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
227c0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
227d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
227e0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
227f0 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
22800 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
22810 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
22820 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
22830 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
22840 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
22850 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
22860 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22870 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
22880 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
22890 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
228a0 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
228b0 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
228c0 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
228d0 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
228e0 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
228f0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
22900 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
22910 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
22920 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
22930 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
22940 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
22950 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
22960 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
22970 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
22980 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
22990 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
229a0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
229b0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
229c0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
229d0 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
229e0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
229f0 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
22a00 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
22a10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
22a20 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
22a30 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
22a40 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
22a50 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
22a60 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
22a70 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
22a80 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
22a90 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
22aa0 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
22ab0 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
22ac0 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
22ad0 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
22ae0 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
22af0 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
22b00 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
22b10 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
22b20 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
22b30 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
22b40 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
22b50 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
22b60 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
22b70 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
22b80 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
22b90 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
22ba0 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
22bb0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
22bc0 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
22bd0 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
22be0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
22bf0 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
22c00 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
22c10 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
22c20 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
22c30 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
22c40 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
22c50 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
22c60 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
22c70 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  tes.  */.  if( p
22c80 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  ->pKeyInfo->nAll
22c90 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20  Field<=13 ){.   
22ca0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e   int flags = p->
22cb0 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20  aMem[0].flags;. 
22cc0 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e     if( p->pKeyIn
22cd0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
22ce0 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  ] ){.      p->r1
22cf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72   = 1;.      p->r
22d00 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  2 = -1;.    }els
22d10 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  e{.      p->r1 =
22d20 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32   -1;.      p->r2
22d30 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
22d40 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
22d50 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72  _Int) ){.      r
22d60 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
22d70 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20  CompareInt;.    
22d80 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
22d90 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
22da0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
22db0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ( flags & MEM_Nu
22dc0 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ll );.    testca
22dd0 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
22de0 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20  Blob );.    if( 
22df0 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  (flags & (MEM_Re
22e00 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  al|MEM_Null|MEM_
22e10 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e  Blob))==0 && p->
22e20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
22e30 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  0]==0 ){.      a
22e40 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d  ssert( flags & M
22e50 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20  EM_Str );.      
22e60 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
22e70 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a  dCompareString;.
22e80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
22e90 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
22ea0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a  ecordCompare;.}.
22eb0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
22ec0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
22ed0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
22ee0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
22ef0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
22f00 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
22f10 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
22f20 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
22f30 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
22f40 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
22f50 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
22f60 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
22f70 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
22f80 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
22f90 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
22fa0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
22fb0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
22fc0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
22fd0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
22fe0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
22ff0 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
23000 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
23010 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
23020 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
23030 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
23040 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
23050 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
23060 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
23070 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
23080 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
23090 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
230a0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
230b0 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
230c0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
230d0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
230e0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
230f0 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
23100 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
23110 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
23120 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65   /* Get the size
23130 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
23140 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63  try.  Only indic
23150 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65  es entries of le
23160 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69  ss.  ** than 2Gi
23170 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20  B are support - 
23180 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d  anything large m
23190 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20  ust be database 
231a0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a  corruption..  **
231b0 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20   Any corruption 
231c0 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73  is detected in s
231d0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
231e0 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67  CellPtr(), thoug
231f0 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20  h, so.  ** this 
23200 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20  code can safely 
23210 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c  assume that nCel
23220 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20  lKey is 32-bits 
23230 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
23240 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23250 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
23260 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
23270 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
23280 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
23290 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c    assert( (nCell
232a0 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58  Key & SQLITE_MAX
232b0 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c  _U32)==(u64)nCel
232c0 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  lKey );..  /* Re
232d0 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ad in the comple
232e0 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  te content of th
232f0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f  e index entry */
23300 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
23310 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
23320 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
23330 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
23340 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
23350 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20  CellKey, &m);.  
23360 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
23370 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
23380 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74  /* The index ent
23390 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  ry must begin wi
233a0 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65  th a header size
233b0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
233c0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
233d0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74  , szHdr);.  test
233e0 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29  case( szHdr==3 )
233f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
23400 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 74 65  Hdr==m.n );.  te
23410 73 74 63 61 73 65 28 20 73 7a 48 64 72 3e 30 78  stcase( szHdr>0x
23420 37 66 66 66 66 66 66 66 20 29 3b 0a 20 20 61 73  7fffffff );.  as
23430 73 65 72 74 28 20 6d 2e 6e 3e 3d 30 20 29 3b 0a  sert( m.n>=0 );.
23440 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
23450 7a 48 64 72 3c 33 20 7c 7c 20 73 7a 48 64 72 3e  zHdr<3 || szHdr>
23460 28 75 6e 73 69 67 6e 65 64 29 6d 2e 6e 29 20 29  (unsigned)m.n) )
23470 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
23480 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
23490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
234a0 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
234b0 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
234c0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
234d0 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
234e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
234f0 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
23500 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
23510 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
23520 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
23530 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
23540 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
23550 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
23560 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
23570 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
23580 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
23590 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
235a0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
235b0 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
235c0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
235d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
235e0 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
235f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
23600 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
23610 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
23620 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
23630 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
23640 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
23650 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
23660 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
23670 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
23680 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
23690 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
236a0 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
236b0 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
236c0 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
236d0 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
236e0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
236f0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
23700 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
23710 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
23720 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
23730 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
23740 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
23750 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
23760 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
23770 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
23780 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
23790 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
237a0 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
237b0 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
237c0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
237d0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
237e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
237f0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
23800 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
23810 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
23820 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
23830 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
23840 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
23850 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
23860 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
23870 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
23880 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
23890 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
238a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
238b0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
238c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
238d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
238e0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
238f0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
23900 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
23910 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
23920 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
23930 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
23940 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
23950 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
23960 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
23970 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
23980 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
23990 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
239a0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
239b0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
239c0 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
239d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
239e0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
239f0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
23a00 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
23a10 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
23a20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
23a30 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
23a40 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
23a50 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
23a60 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
23a70 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
23a80 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
23a90 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
23aa0 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
23ab0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
23ac0 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
23ad0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
23ae0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
23af0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
23b00 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
23b10 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
23b20 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
23b30 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
23b40 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
23b50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
23b60 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
23b70 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
23b80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
23b90 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
23ba0 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
23bb0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
23bc0 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
23bd0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
23be0 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
23bf0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23c10 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
23c20 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
23c30 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
23c40 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
23c50 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
23c60 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b   *pCur;.  Mem m;
23c70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ..  assert( pC->
23c80 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
23c90 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75  E_BTREE );.  pCu
23ca0 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
23cb0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
23cc0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23cd0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
23ce0 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71  .  nCellKey = sq
23cf0 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
23d00 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f  dSize(pCur);.  /
23d10 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20  * nCellKey will 
23d20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65  always be betwee
23d30 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66  n 0 and 0xffffff
23d40 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ff because of th
23d50 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20  e way.  ** that 
23d60 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
23d70 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47  r() and sqlite3G
23d80 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65  etVarint32() are
23d90 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a   implemented */.
23da0 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
23db0 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
23dc0 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  7fffffff ){.    
23dd0 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
23de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23df0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
23e00 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
23e10 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20  it(&m, db, 0);. 
23e20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
23e30 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
23e40 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  ur, 0, (u32)nCel
23e50 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28  lKey, &m);.  if(
23e60 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
23e70 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73  n rc;.  }.  *res
23e80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
23e90 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
23ea0 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  kip(m.n, m.z, pU
23eb0 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20 20 73  npacked, 0);.  s
23ec0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
23ed0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
23ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23ef0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
23f00 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
23f10 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
23f20 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
23f30 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
23f40 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
23f50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
23f60 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
23f70 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
23f80 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
23f90 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
23fa0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
23fb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23fc0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
23fd0 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
23fe0 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
23ff0 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
24000 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
24010 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
24020 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
24030 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
24040 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
24050 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
24060 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
24070 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
24080 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
24090 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
240a0 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
240b0 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
240c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
240d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
240e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
240f0 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
24100 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
24110 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
24120 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
24130 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
24140 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
24150 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
24160 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
24170 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
24180 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
24190 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
241a0 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
241b0 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
241c0 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
241d0 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
241e0 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
241f0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
24200 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
24210 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
24220 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
24230 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
24240 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20  obsolete..**.** 
24250 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c 20 74  If iCode is 1, t
24260 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e 20 69  hen expiration i
24270 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65  s advisory.  The
24280 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f 75 6c   statement shoul
24290 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70 61 72  d.** be reprepar
242a0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
242b0 72 65 73 74 61 72 74 65 64 2c 20 62 75 74 20 69  restarted, but i
242c0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
242d0 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20 69 73  running.** it is
242e0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75 6e 20   allowed to run 
242f0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a  to completion..*
24300 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c 79 2c  *.** Internally,
24310 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
24320 75 73 74 20 73 65 74 73 20 74 68 65 20 56 64 62  ust sets the Vdb
24330 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67 20 6f  e.expired flag o
24340 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61 72 65  n all.** prepare
24350 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  d statements.  T
24360 68 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  he flag is set t
24370 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d 65 64  o 1 for an immed
24380 69 61 74 65 20 65 78 70 69 72 61 74 69 6f 6e 0a  iate expiration.
24390 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20 32 20  ** and set to 2 
243a0 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72 79 20  for an advisory 
243b0 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  expiration..*/.v
243c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
243d0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
243e0 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nts(sqlite3 *db,
243f0 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20 20 56   int iCode){.  V
24400 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
24410 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
24420 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
24430 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 69 43   p->expired = iC
24440 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ode+1;.  }.}../*
24450 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
24460 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
24470 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
24480 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
24490 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
244a0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
244b0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
244c0 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49 54 45  eturn the SQLITE
244d0 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73 20 66  _PREPARE flags f
244e0 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a 75 38  or a Vdbe..*/.u8
244f0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 70   sqlite3VdbePrep
24500 61 72 65 46 6c 61 67 73 28 56 64 62 65 20 2a 76  areFlags(Vdbe *v
24510 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 70  ){.  return v->p
24520 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a  repFlags;.}../*.
24530 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
24540 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
24550 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
24560 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
24570 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20   value bound.** 
24580 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f  parameter iVar o
24590 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20  f VM v. Except, 
245a0 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
245b0 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74  an SQL NULL, ret
245c0 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61  urn .** 0 instea
245d0 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  d. Unless it is 
245e0 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69  NULL, apply affi
245f0 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66  nity aff (one of
24600 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
24610 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20  *.** constants) 
24620 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  to the value bef
24630 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74  ore returning it
24640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
24650 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20  rned value must 
24660 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
24670 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
24680 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
24690 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
246a0 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  e *sqlite3VdbeGe
246b0 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65  tBoundValue(Vdbe
246c0 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75   *v, int iVar, u
246d0 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74  8 aff){.  assert
246e0 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
246f0 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  ( v ){.    Mem *
24700 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b  pMem = &v->aVar[
24710 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  iVar-1];.    ass
24720 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c 61  ert( (v->db->fla
24730 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62  gs & SQLITE_Enab
24740 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20 20  leQPSG)==0 );.  
24750 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
24760 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
24770 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
24780 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
24790 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
247a0 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
247b0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
247c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
247d0 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
247e0 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
247f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
24800 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
24810 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
24820 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  F8);.      }.   
24830 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
24840 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24850 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
24860 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
24870 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
24880 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
24890 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
248a0 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
248b0 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
248c0 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
248d0 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
248e0 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
248f0 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
24900 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
24910 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
24920 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
24930 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
24940 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 61 73  ( iVar>0 );.  as
24950 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c  sert( (v->db->fl
24960 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61  ags & SQLITE_Ena
24970 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20  bleQPSG)==0 );. 
24980 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20 29 7b   if( iVar>=32 ){
24990 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
249a0 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b 0a 20  |= 0x80000000;. 
249b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
249c0 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
249d0 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
249e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75    }.}../*.** Cau
249f0 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f  se a function to
24a00 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   throw an error 
24a10 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c 20 66  if it was call f
24a20 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e 63 0a  rom OP_PureFunc.
24a30 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 4f  ** rather than O
24a40 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  P_Function..**.*
24a50 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20 6d 65  * OP_PureFunc me
24a60 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 75 6e  ans that the fun
24a70 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 65  ction must be de
24a80 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61 6e 64  terministic, and
24a90 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72 6f 77   should.** throw
24aa0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20   an error if it 
24ab0 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74 73 20  is given inputs 
24ac0 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20  that would make 
24ad0 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  it non-determini
24ae0 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  stic..** This ro
24af0 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
24b00 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20 66 75   by date/time fu
24b10 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65  nctions that use
24b20 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
24b30 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73 20 73  ic.** features s
24b40 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a 2a 2f  uch as 'now'..*/
24b50 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 74 50  .int sqlite3NotP
24b60 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  ureFunc(sqlite3_
24b70 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
24b80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
24b90 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
24ba0 41 54 34 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  AT4.  if( pCtx->
24bb0 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74 75 72  pVdbe==0 ) retur
24bc0 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  n 1;.#endif.  if
24bd0 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d 3e 61  ( pCtx->pVdbe->a
24be0 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e 6f 70  Op[pCtx->iOp].op
24bf0 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46 75 6e  code==OP_PureFun
24c00 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
24c10 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
24c20 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e 6f 6e  tx, .       "non
24c30 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66  -deterministic f
24c40 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64 65 78  unction in index
24c50 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 43   expression or C
24c60 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 22  HECK constraint"
24c70 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a 20 20  ,.       -1);.  
24c80 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
24c90 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
24ca0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24cb0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
24cc0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
24cd0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
24ce0 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65  t from an sqlite
24cf0 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28  3_vtab.zErrMsg (
24d00 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
24d10 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
24d20 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
24d30 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64  alloc) into a Vd
24d40 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  be.zErrMsg (text
24d50 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
24d60 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
24d70 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
24d80 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc)..*/.void sql
24d90 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
24da0 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71  rmsg(Vdbe *p, sq
24db0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
24dc0 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d  b){.  if( pVtab-
24dd0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
24de0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
24df0 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >db;.    sqlite3
24e00 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
24e10 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
24e20 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
24e30 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74  DbStrDup(db, pVt
24e40 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
24e50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24e60 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
24e70 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d      pVtab->zErrM
24e80 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  sg = 0;.  }.}.#e
24e90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
24ea0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
24eb0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
24ec0 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
24ed0 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20  ATE_HOOK../*.** 
24ee0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
24ef0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
24f00 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20  LL, release any 
24f10 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
24f20 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
24f30 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  the memory cells
24f40 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b   in the p->aMem[
24f50 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72  ] array. Also fr
24f60 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52  ee the UnpackedR
24f70 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
24f80 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67  re itself, using
24f90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
24fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
24fb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
24fc0 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65   free UnpackedRe
24fd0 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20  cord structures 
24fe0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
24ff0 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65  the vdbeUnpackRe
25000 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  cord() function 
25010 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69  found in vdbeapi
25020 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .c..*/.static vo
25030 69 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  id vdbeFreeUnpac
25040 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ked(sqlite3 *db,
25050 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70   int nField, Unp
25060 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
25070 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
25080 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
25090 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b  =0; i<nField; i+
250a0 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  +){.      Mem *p
250b0 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69  Mem = &p->aMem[i
250c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ];.      if( pMe
250d0 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m->zMalloc ) sql
250e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
250f0 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  se(pMem);.    }.
25100 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25110 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  eNN(db, p);.  }.
25120 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
25130 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
25140 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66  ATE_HOOK */..#if
25150 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
25160 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
25170 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
25180 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
25190 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  k. If this is an
251a0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
251b0 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c  E pre-update cal
251c0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f  l,.** then curso
251d0 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
251e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
251f0 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
25200 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a  the row about.**
25210 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72   to be update or
25220 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65   deleted. If the
25230 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c   application cal
25240 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  ls sqlite3_preup
25250 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74  date_old(),.** t
25260 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75  he required valu
25270 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  e will be read f
25280 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20  rom the row the 
25290 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
252a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
252b0 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f  3VdbePreUpdateHo
252c0 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ok(.  Vdbe *v,  
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72        /* Vdbe pr
252f0 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73  e-update hook is
25300 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20   invoked by */. 
25310 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73   VdbeCursor *pCs
25320 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
25330 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72   /* Cursor to gr
25340 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20  ab old.* values 
25350 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  from */.  int op
25360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
25380 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41  ITE_INSERT, UPDA
25390 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a  TE or DELETE */.
253a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
253b0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
253c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
253d0 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
253e0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
253f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66          /* Modif
25400 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ied table */.  i
25410 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20  64 iKey1,       
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25430 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61  * Initial key va
25440 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  lue */.  int iRe
25450 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
25460 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
25470 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72  ster for new.* r
25480 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  ecord */.){.  sq
25490 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64  lite3 *db = v->d
254a0 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a  b;.  i64 iKey2;.
254b0 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75    PreUpdate preu
254c0 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pdate;.  const c
254d0 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62  har *zTbl = pTab
254e0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69  ->zName;.  stati
254f0 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53  c const u8 fakeS
25500 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20  ortOrder = 0;.. 
25510 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72   assert( db->pPr
25520 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20  eUpdate==0 );.  
25530 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64 61 74  memset(&preupdat
25540 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65  e, 0, sizeof(Pre
25550 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20  Update));.  if( 
25560 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d  HasRowid(pTab)==
25570 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d  0 ){.    iKey1 =
25580 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20 20 20   iKey2 = 0;.    
25590 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20 3d 20  preupdate.pPk = 
255a0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
255b0 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
255c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6f  }else{.    if( o
255d0 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
255e0 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20   ){.      iKey2 
255f0 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e  = v->aMem[iReg].
25600 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  u.i;.    }else{.
25610 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b        iKey2 = iK
25620 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ey1;.    }.  }..
25630 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
25640 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
25650 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ol .       || (p
25660 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
25670 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d  b->nCol+1 && op=
25680 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26  =SQLITE_DELETE &
25690 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b  & iReg==-1).  );
256a0 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20  ..  preupdate.v 
256b0 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65  = v;.  preupdate
256c0 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20  .pCsr = pCsr;.  
256d0 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f  preupdate.op = o
256e0 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  p;.  preupdate.i
256f0 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  NewReg = iReg;. 
25700 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
25710 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72  fo.db = db;.  pr
25720 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
25730 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
25740 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
25750 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 70  fo.nKeyField = p
25760 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65  Tab->nCol;.  pre
25770 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61  update.keyinfo.a
25780 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
25790 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b  )&fakeSortOrder;
257a0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
257b0 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72  y1 = iKey1;.  pr
257c0 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20  eupdate.iKey2 = 
257d0 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61  iKey2;.  preupda
257e0 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  te.pTab = pTab;.
257f0 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
25800 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a  e = &preupdate;.
25810 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65    db->xPreUpdate
25820 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72  Callback(db->pPr
25830 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20  eUpdateArg, db, 
25840 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69  op, zDb, zTbl, i
25850 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20  Key1, iKey2);.  
25860 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d  db->pPreUpdate =
25870 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
25880 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74  ree(db, preupdat
25890 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64  e.aRecord);.  vd
258a0 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64  beFreeUnpacked(d
258b0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  b, preupdate.key
258c0 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31  info.nKeyField+1
258d0 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70  , preupdate.pUnp
258e0 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65 46 72  acked);.  vdbeFr
258f0 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
25900 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
25910 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72  .nKeyField+1, pr
25920 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61  eupdate.pNewUnpa
25930 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65  cked);.  if( pre
25940 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20  update.aNew ){. 
25950 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
25960 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
25970 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
25980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
25990 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64  mRelease(&preupd
259a0 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20  ate.aNew[i]);.  
259b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
259c0 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72 65 75  bFreeNN(db, preu
259d0 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d  pdate.aNew);.  }
259e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
259f0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
25a00 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a           DATE_HOOK */.