/ Hex Artifact Content
Login

Artifact 24cbf0ee60c7bba3be5b9ae14c01810450a533a022705254774c1e49590a15d3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70   pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42  A->expmask;.  pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41  ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d  ->prepFlags;.  m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74  emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72  er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f  , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61  unter));.  pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f  ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20  es not grow too 
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e  large */.  if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69  New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20  _VDBE_OP] ){.   
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  (p->db);.    ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
15c0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
15d0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74  Op[i]);.    test
15e0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
15f0: 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t();.  }.#endif.
1600: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
1610: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
1620: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1630: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
1640: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1650: 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d  _COVERAGE.  pOp-
1660: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23  >iSrcLine = 0;.#
1670: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
1680: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1690: 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a  dbeAddOp0(Vdbe *
16a0: 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65  p, int op){.  re
16b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c  AddOp3(p, op, 0,
16d0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
16e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
1700: 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75   int p1){.  retu
1710: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1720: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1730: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
1740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56  ite3VdbeAddOp2(V
1750: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1760: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
1770: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1780: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1790: 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d  p, p1, p2, 0);.}
17a0: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
17b0: 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64  de for an uncond
17c0: 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20  itional jump to 
17d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73  instruction iDes
17e0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
17f0: 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70  VdbeGoto(Vdbe *p
1800: 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20  , int iDest){.  
1810: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1820: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47  beAddOp3(p, OP_G
1830: 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30  oto, 0, iDest, 0
1840: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  );.}../* Generat
1850: 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20  e code to cause 
1860: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20  the string zStr 
1870: 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74  to be loaded int
1880: 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44  o.** register iD
1890: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
18a0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
18b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
18c0: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
18d0: 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e  *zStr){.  return
18e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f0: 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(p, OP_String8
1900: 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a  , 0, iDest, 0, z
1910: 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str, 0);.}../*.*
1920: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1930: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
1940: 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74   multiple regist
1950: 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72  ers to string or
1960: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
1970: 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  tants.  The regi
1980: 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 68  sters begin with
1990: 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65   iDest and incre
19a0: 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c  ase consecutivel
19b0: 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74  y..** One regist
19c0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
19d0: 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61  d for each chara
19e0: 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b  cgter in zTypes[
19f0: 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20  ].  For each.** 
1a00: 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69 6e  "s" character in
1a10: 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72   zTypes[], the r
1a20: 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74 72  egister is a str
1a30: 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 6d  ing if the argum
1a40: 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55  ent is.** not NU
1a50: 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69  LL, or OP_Null i
1a60: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1a70: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20   null pointer.  
1a80: 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 61  For each "i" cha
1a90: 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79  racter.** in zTy
1aa0: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1ab0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1ac0: 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
1ad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1ae0: 6e 70 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73  nput string does
1af0: 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58   not end with "X
1b00: 22 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73  " then an OP_Res
1b10: 75 6c 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69  ultRow instructi
1b20: 6f 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  on.** is generat
1b30: 65 64 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ed for the value
1b40: 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76  s inserted..*/.v
1b50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
1b60: 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70  ultiLoad(Vdbe *p
1b70: 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e  , int iDest, con
1b80: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c  st char *zTypes,
1b90: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1ba0: 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   ap;.  int i;.  
1bb0: 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61  char c;.  va_sta
1bc0: 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a  rt(ap, zTypes);.
1bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
1be0: 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69  zTypes[i])!=0; i
1bf0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++){.    if( c==
1c00: 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  's' ){.      con
1c10: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f  st char *z = va_
1c20: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
1c30: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
1c40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1c50: 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20   z==0 ? OP_Null 
1c60: 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  : OP_String8, 0,
1c70: 20 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20   iDest+i, 0, z, 
1c80: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
1c90: 28 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  ( c=='i' ){.    
1ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb0: 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(p, OP_Intege
1cc0: 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  r, va_arg(ap, in
1cd0: 74 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20  t), iDest+i);.  
1ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
1cf0: 6f 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75  oto skip_op_resu
1d00: 6c 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d  ltrow;.    }.  }
1d10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d20: 64 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(p, OP_Resul
1d30: 74 52 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b  tRow, iDest, i);
1d40: 0a 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72  .skip_op_resultr
1d50: 6f 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  ow:.  va_end(ap)
1d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1d70: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1d80: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1d90: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1da0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1db0: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1dc0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1dd0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1de0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
1df0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
1e00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1e10: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
1e20: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
1e30: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
1e40: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e60: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1e70: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e90: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1eb0: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1ed0: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1ee0: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
1ef0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
1f00: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1f10: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1f20: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1f30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1f40: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1f50: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1f60: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1f70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1f80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1f90: 70 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  p4 value with a 
1fa0: 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50  P4_INT64 or.** P
1fb0: 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a  4_REAL type..*/.
1fc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1fd0: 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62  ddOp4Dup8(.  Vdb
1fe0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ff0: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
2000: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
2010: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2020: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2030: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
2040: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
2050: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
2060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2080: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
2090: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
20b0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
20c0: 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20  onst u8 *zP4,   
20d0: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
20e0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
20f0: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
2100: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
2110: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
2120: 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44  4copy = sqlite3D
2130: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c  bMallocRawNN(sql
2140: 69 74 65 33 56 64 62 65 44 62 28 70 29 2c 20 38  ite3VdbeDb(p), 8
2150: 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20  );.  if( p4copy 
2160: 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c  ) memcpy(p4copy,
2170: 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75   zP4, 8);.  retu
2180: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
2190: 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp4(p, op, p1, 
21a0: 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20  p2, p3, p4copy, 
21b0: 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e  p4type);.}..#ifn
21c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21d0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65  EXPLAIN./*.** Re
21e0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
21f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2200: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2210: 41 4e 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20  AN baseline..** 
2220: 30 20 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a  0 means "none"..
2230: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2240: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2250: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2260: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2270: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
2280: 72 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  rExplain==0 ) re
2290: 74 75 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20  turn 0;.  pOp = 
22a0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
22b0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c  pParse->addrExpl
22d0: 61 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ain);.  return p
22e0: 4f 70 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op->p2;.}../*.**
22f0: 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78   Add a new OP_Ex
2300: 70 6c 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  plain opcode..**
2310: 0a 2a 2a 20 49 66 20 74 68 65 20 62 50 75 73 68  .** If the bPush
2320: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
2330: 68 65 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70  hen make this op
2340: 63 6f 64 65 20 74 68 65 20 70 61 72 65 6e 74 20  code the parent 
2350: 66 6f 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  for.** subsequen
2360: 74 20 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c  t Explains until
2370: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
2380: 61 69 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c  ainPop() is call
2390: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
23a0: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50  te3VdbeExplain(P
23b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38  arse *pParse, u8
23c0: 20 62 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68   bPush, const ch
23d0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
23e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
23f0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2400: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20  char *zMsg;.    
2410: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f  Vdbe *v;.    va_
2420: 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74  list ap;.    int
2430: 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73   iThis;.    va_s
2440: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
2450: 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
2460: 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73  e3VMPrintf(pPars
2470: 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29  e->db, zFmt, ap)
2480: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
2490: 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  ;.    v = pParse
24a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68  ->pVdbe;.    iTh
24b0: 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  is = v->nOp;.   
24c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24d0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
24e0: 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d  , iThis, pParse-
24f0: 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c  >addrExplain, 0,
2500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2510: 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f         zMsg, P4_
2520: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66  DYNAMIC);.    if
2530: 28 20 62 50 75 73 68 29 20 70 50 61 72 73 65 2d  ( bPush) pParse-
2540: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69  >addrExplain = i
2550: 54 68 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  This;.  }.}../*.
2560: 2a 2a 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41  ** Pop the EXPLA
2570: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74  IN QUERY PLAN st
2580: 61 63 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a  ack one level..*
2590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25a0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72  beExplainPop(Par
25b0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
25c0: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
25d0: 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  in = sqlite3Vdbe
25e0: 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50  ExplainParent(pP
25f0: 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  arse);.}.#endif 
2600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
2610: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
2620: 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65   Add an OP_Parse
2630: 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20  Schema opcode.  
2640: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2650: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a  broken out from.
2660: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
2670: 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20  dOp4() since it 
2680: 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65  needs to also ne
2690: 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20  eds to mark all 
26a0: 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76  btrees.** as hav
26b0: 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a  ing been used..*
26c0: 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20  *.** The zWhere 
26d0: 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65  string must have
26e0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
26f0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
2700: 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  oc()..** This ro
2710: 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20  utine will take 
2720: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
2730: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
2740: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
2750: 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
2760: 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20  hemaOp(Vdbe *p, 
2770: 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a  int iDb, char *z
2780: 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b  Where){.  int j;
2790: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
27a0: 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65  dOp4(p, OP_Parse
27b0: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20  Schema, iDb, 0, 
27c0: 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59  0, zWhere, P4_DY
27d0: 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d  NAMIC);.  for(j=
27e0: 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b  0; j<p->db->nDb;
27f0: 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62   j++) sqlite3Vdb
2800: 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29  eUsesBtree(p, j)
2810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2820: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
2830: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
2840: 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65  lue as an intege
2850: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a  3VdbeAddOp4Int(.
2870: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
2880: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
2890: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
28a0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28c0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
28d0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
28e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
28f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2900: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
2910: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
2920: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2940: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
2950: 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20  /.  int p4      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2970: 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20  4 operand as an 
2980: 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20  integer */.){.  
2990: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
29a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
29b0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
29c0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
29d0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
29e0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
29f0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
2a00: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
2a10: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
2a20: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34    pOp->p4.i = p4
2a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2a40: 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72  ddr;.}../* Inser
2a50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63  t the end of a c
2a60: 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69  o-routine.*/.voi
2a70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64  d sqlite3VdbeEnd
2a80: 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a  Coroutine(Vdbe *
2a90: 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29  v, int regYield)
2aa0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
2ab0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
2ac0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
2ad0: 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  ld);..  /* Clear
2ae0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72   the temporary r
2af0: 65 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74  egister cache, t
2b00: 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20  hereby ensuring 
2b10: 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63  that each.  ** c
2b20: 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74  o-routine has it
2b30: 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e  s own independen
2b40: 74 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65  t set of registe
2b50: 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72  rs, because co-r
2b60: 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67  outines.  ** mig
2b70: 68 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20  ht expect their 
2b80: 72 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20  registers to be 
2b90: 70 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73  preserved across
2ba0: 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e   an OP_Yield, an
2bb0: 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c  d.  ** that coul
2bc0: 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73  d cause problems
2bd0: 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
2be0: 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20  co-routines are 
2bf0: 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
2c00: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65   ** temporary re
2c10: 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76  gister..  */.  v
2c20: 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ->pParse->nTempR
2c30: 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61  eg = 0;.  v->pPa
2c40: 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2c50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2c60: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
2c70: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
2c80: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
2c90: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
2ca0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
2cb0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
2cc0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
2cd0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
2ce0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
2cf0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
2d00: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
2d10: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
2d20: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
2d30: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
2d40: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
2d50: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
2d60: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
2d70: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
2d80: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
2d90: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
2da0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
2db0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
2dc0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
2dd0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
2de0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
2df0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
2e00: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
2e10: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
2e20: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
2e30: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
2e40: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
2e50: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
2e60: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
2e70: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
2e80: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
2e90: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
2ea0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
2ed0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2ee0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
2ef0: 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  v){.  Parse *p =
2f00: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
2f10: 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b  t i = p->nLabel+
2f20: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  +;.  assert( v->
2f30: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2f40: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2f50: 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29  (i & (i-1))==0 )
2f60: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  {.    p->aLabel 
2f70: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2f80: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
2f90: 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20  p->aLabel, .    
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f     (i*2+1)*sizeo
2fd0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29  f(p->aLabel[0]))
2fe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
2ff0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
3000: 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a  aLabel[i] = -1;.
3010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44    }.  return ADD
3020: 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  R(i);.}../*.** R
3030: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
3040: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
3050: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3060: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
3070: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
3080: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
3090: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
30a0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
30b0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
30c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
30d0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
30e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30f0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  lveLabel(Vdbe *v
3100: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73  , int x){.  Pars
3110: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
3120: 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52  ;.  int j = ADDR
3130: 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  (x);.  assert( v
3140: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3150: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
3160: 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65  sert( j<p->nLabe
3170: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  l );.  assert( j
3180: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3190: 61 4c 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66  aLabel ){.#ifdef
31a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
31b0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
31c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
31d0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
31e0: 20 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f      printf("RESO
31f0: 4c 56 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20  LVE LABEL %d to 
3200: 25 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70  %d\n", x, v->nOp
3210: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
3220: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
3230: 4c 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29  Label[j]==(-1) )
3240: 3b 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20  ; /* Labels may 
3250: 6f 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64  only be resolved
3260: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e   once */.    p->
3270: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3280: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
3290: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
32a0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
32b0: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
32c0: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
32d0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
32e0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
32f0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
3300: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
3310: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
3320: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
3330: 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20  be run multiple 
3340: 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  times..*/.void s
3350: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
3360: 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  le(Vdbe *p){.  p
3370: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
3380: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
3390: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
33a0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
33b0: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
33c0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
33d0: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
33e0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
33f0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3400: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
3410: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
3420: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
3430: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
3440: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
3450: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
3460: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
3470: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
3480: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
3490: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
34a0: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
34b0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
34c0: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
34d0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
34e0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
34f0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3510: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
3520: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
3530: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3540: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3550: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
3560: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
3570: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
3580: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3590: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
35a0: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
35b0: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
35c0: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
35d0: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
35e0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
35f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3600: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
3610: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
3620: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
3630: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
3640: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
3650: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
3660: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
3670: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
3680: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3690: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
36a0: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
36b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
36c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
36d0: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
36e0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
36f0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
3720: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
3730: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
3740: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
3750: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
3760: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
3770: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
3780: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
3790: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
37a0: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
37b0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
37c0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
37d0: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
37e0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
37f0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
3800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
3810: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
3820: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
3830: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
3840: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
3850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3860: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
3870: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
3880: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
3890: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
38a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
38b0: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
38c0: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
38d0: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
38e0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
38f0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
3900: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
3910: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
3920: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
3930: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
3940: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
3950: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3960: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
3970: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
3980: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
3990: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
39a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
39b0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
39c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
39d0: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
39e0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
39f0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
3a00: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
3a10: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
3a20: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
3a30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
3a40: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
3a50: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
3a60: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
3a70: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
3a80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3a90: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
3aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
3ab0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
3ac0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
3ad0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
3ae0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
3af0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
3b00: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
3b10: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
3b20: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
3b30: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
3b40: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
3b50: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
3b60: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
3b70: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
3b80: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
3b90: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
3ba0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
3bc0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
3bd0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3be0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3bf0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
3c00: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
3c10: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
3c20: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
3c30: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
3c40: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
3c50: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
3c60: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
3c70: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
3c80: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
3c90: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
3ca0: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20  constraint).**  
3cb0: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72   *  OP_CreateBtr
3cc0: 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  ee/BTREE_INTKEY 
3cd0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
3ce0: 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66  tine .**      (f
3cf0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
3d00: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
3d10: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
3d20: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
3d30: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3d40: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3d50: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3d60: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3d70: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3d80: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3d90: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3da0: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3db0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3dc0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
3dd0: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
3de0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
3df0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
3e00: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
3e10: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
3e20: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
3e30: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3e40: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3e50: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3e60: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3e70: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3e80: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3e90: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3ea0: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3eb0: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3ec0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3ed0: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
3ee0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
3ef0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
3f00: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
3f10: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
3f20: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3f30: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3f40: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3f50: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3f60: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3f70: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3f80: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3f90: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3fa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3fb0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3fc0: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3fd0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
3fe0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
3ff0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
4000: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
4010: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
4020: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
4030: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
4040: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
4050: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
4060: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
4070: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
4080: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
4090: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42  code==OP_CreateB
40a0: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d  tree && pOp->p3=
40b0: 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20  =BTREE_INTKEY ) 
40c0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
40d0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
40e0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
40f0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
4100: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
4110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4120: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
4130: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4140: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
4150: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
4160: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
4170: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
4180: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4190: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
41a0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
41b0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
41c0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
41d0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
41e0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
41f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
4200: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
4210: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
4220: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
4230: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
4240: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
4250: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
4260: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
4270: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
4280: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
4290: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
42a0: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
42b0: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
42c0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
42d0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
42e0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
42f0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
4300: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
4310: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
4320: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
4340: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
4350: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
4360: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
4370: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
4380: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
4390: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
43a0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  function */..#if
43b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
43c0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
43d0: 20 74 68 65 20 6e 57 72 69 74 65 20 63 6f 75 6e   the nWrite coun
43e0: 74 65 72 20 69 6e 20 74 68 65 20 56 44 42 45 20  ter in the VDBE 
43f0: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
4400: 20 6e 6f 74 20 61 6e 0a 2a 2a 20 65 70 68 65 6d   not an.** ephem
4410: 65 72 61 6c 20 63 75 72 73 6f 72 2c 20 6f 72 20  eral cursor, or 
4420: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 72  if the cursor ar
4430: 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a  gument is NULL..
4440: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4450: 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e  dbeIncrWriteCoun
4460: 74 65 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ter(Vdbe *p, Vdb
4470: 65 43 75 72 73 6f 72 20 2a 70 43 29 7b 0a 20 20  eCursor *pC){.  
4480: 69 66 28 20 70 43 3d 3d 30 0a 20 20 20 7c 7c 20  if( pC==0.   || 
4490: 28 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43  (pC->eCurType!=C
44a0: 55 52 54 59 50 45 5f 53 4f 52 54 45 52 0a 20 20  URTYPE_SORTER.  
44b0: 20 20 20 20 20 26 26 20 70 43 2d 3e 65 43 75 72       && pC->eCur
44c0: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53  Type!=CURTYPE_PS
44d0: 45 55 44 4f 0a 20 20 20 20 20 20 20 26 26 20 21  EUDO.       && !
44e0: 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 29  pC->isEphemeral)
44f0: 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 57 72  .  ){.    p->nWr
4500: 69 74 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ite++;.  }.}.#en
4510: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4520: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41  TE_DEBUG./*.** A
4530: 73 73 65 72 74 20 69 66 20 61 6e 20 41 62 6f 72  ssert if an Abor
4540: 74 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  t at this point 
4550: 69 6e 20 74 69 6d 65 20 6d 69 67 68 74 20 72 65  in time might re
4560: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70  sult in a corrup
4570: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  t.** database..*
4580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4590: 62 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c  beAssertAbortabl
45a0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  e(Vdbe *p){.  as
45b0: 73 65 72 74 28 20 70 2d 3e 6e 57 72 69 74 65 3d  sert( p->nWrite=
45c0: 3d 30 20 7c 7c 20 70 2d 3e 75 73 65 73 53 74 6d  =0 || p->usesStm
45d0: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65  tJournal );.}.#e
45e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
45f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4600: 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ed after all opc
4610: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
4620: 6e 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f  nserted.  It loo
4630: 70 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  ps.** through al
4640: 6c 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e  l the opcodes an
4650: 64 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20  d fixes up some 
4660: 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28  details..**.** (
4670: 31 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70  1) For each jump
4680: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74   instruction wit
4690: 68 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  h a negative P2 
46a0: 76 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a  value (a label).
46b0: 2a 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74  **     resolve t
46c0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61  he P2 value to a
46d0: 6e 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73  n actual address
46e0: 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70  ..**.** (2) Comp
46f0: 75 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ute the maximum 
4700: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
4710: 6e 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20  nts used by any 
4720: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  SQL function.** 
4730: 20 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68      and store th
4740: 61 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61  at value in *pMa
4750: 78 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a  xFuncArgs..**.**
4760: 20 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20   (3) Update the 
4770: 56 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e  Vdbe.readOnly an
4780: 64 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72  d Vdbe.bIsReader
4790: 20 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61   flags to accura
47a0: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69  tely.**     indi
47b0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72  cate what the pr
47c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
47d0: 20 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a   actually does..
47e0: 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61  **.** (4) Initia
47f0: 6c 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76  lize the p4.xAdv
4800: 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  ance pointer on 
4810: 6f 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65  opcodes that use
4820: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52   it..**.** (5) R
4830: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
4840: 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  y allocated for 
4850: 73 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a  storing labels..
4860: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4870: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e  ne will only fun
4880: 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20  ction correctly 
4890: 69 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  if the mkopcodeh
48a0: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a  .tcl generator.*
48b0: 2a 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73  * script numbers
48c0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72   the opcodes cor
48d0: 72 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73  rectly.  Changes
48e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
48f0: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72   must be.** coor
4900: 64 69 6e 61 74 65 64 20 77 69 74 68 20 63 68 61  dinated with cha
4910: 6e 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65  nges to mkopcode
4920: 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  h.tcl..*/.static
4930: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
4940: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
4950: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
4960: 29 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  ){.  int nMaxArg
4970: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
4980: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
4990: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
49a0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
49b0: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
49c0: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
49d0: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
49e0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
49f0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
4a00: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77  p[p->nOp-1];.  w
4a10: 68 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a  hile(1){..    /*
4a20: 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64   Only JUMP opcod
4a30: 65 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74  es and the short
4a40: 20 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c   list of special
4a50: 20 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20   opcodes in the 
4a60: 73 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65  switch.    ** be
4a70: 6c 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63  low need to be c
4a80: 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65 20  onsidered.  The 
4a90: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65  mkopcodeh.tcl ge
4aa0: 6e 65 72 61 74 6f 72 20 73 63 72 69 70 74 20 67  nerator script g
4ab0: 72 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c  roups.    ** all
4ac0: 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74   these opcodes t
4ad0: 6f 67 65 74 68 65 72 20 6e 65 61 72 20 74 68 65  ogether near the
4ae0: 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70   front of the op
4af0: 63 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70  code list.  Skip
4b00: 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f  .    ** any opco
4b10: 64 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  de that does not
4b20: 20 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67   need processing
4b30: 20 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74   by virtual of t
4b40: 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20  he fact that.   
4b50: 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72   ** it is larger
4b60: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f   than SQLITE_MX_
4b70: 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20  JUMP_OPCODE, as 
4b80: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
4b90: 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
4ba0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  */.    if( pOp->
4bb0: 6f 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d  opcode<=SQLITE_M
4bc0: 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b  X_JUMP_OPCODE ){
4bd0: 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  .      /* NOTE: 
4be0: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
4bf0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20  e mkopcodeh.tcl 
4c00: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
4c10: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a  emoving.      **
4c20: 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73   cases from this
4c30: 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20   switch! */.    
4c40: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
4c50: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
4c60: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
4c70: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
4c80: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30    if( pOp->p2!=0
4c90: 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   ) p->readOnly =
4ca0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   0;.          /*
4cb0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
4cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4cd0: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
4ce0: 69 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  it:.        case
4cf0: 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b   OP_Savepoint: {
4d00: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49  .          p->bI
4d10: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
4d20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4d30: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
4d40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
4d50: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4d60: 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64  Checkpoint:.#end
4d70: 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  if.        case 
4d80: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
4d90: 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e     case OP_Journ
4da0: 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20  alMode: {.      
4db0: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
4dc0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
4dd0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
4de0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4df0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4e00: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74      case OP_Next
4e10: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4e20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
4e30: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
4e40: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
4e50: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
4e60: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
4e70: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
4e80: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E;.          /* 
4e90: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
4ea0: 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61  or never codes a
4eb0: 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f  ny of these opco
4ec0: 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20  des as a jump.  
4ed0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20          ** to a 
4ee0: 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65  label.  They are
4ef0: 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73   always coded as
4f00: 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64   a jump backward
4f10: 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20  s to a .        
4f20: 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65    ** known addre
4f30: 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ss */.          
4f40: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
4f50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
4f60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4f70: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4f80: 5f 50 72 65 76 3a 20 7b 0a 20 20 20 20 20 20 20  _Prev: {.       
4f90: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
4fa0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4fb0: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4fc0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4fd0: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4ff0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
5000: 6e 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20  never codes any 
5010: 6f 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73  of these opcodes
5020: 20 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20   as a jump.     
5030: 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62       ** to a lab
5040: 65 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c  el.  They are al
5050: 77 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20  ways coded as a 
5060: 6a 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74  jump backwards t
5070: 6f 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a  o a .          *
5080: 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20  * known address 
5090: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
50a0: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20  ert( pOp->p2>=0 
50b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
50c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ak;.        }.#i
50d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
50f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5100: 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20  Update: {.      
5110: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
5120: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5130: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
5140: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5160: 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65    case OP_VFilte
5170: 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  r: {.          i
5180: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
5190: 61 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70  assert( (pOp - p
51a0: 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20  ->aOp) >= 3 );. 
51b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
51c0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
51d0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
51e0: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70           n = pOp
51f0: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20  [-1].p1;.       
5200: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
5210: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
5220: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;.          /* F
5230: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
5240: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73   the default cas
5250: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23  e */.        }.#
5260: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65  endif.        de
5270: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
5280: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30     if( pOp->p2<0
5290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
52a0: 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  /* The mkopcodeh
52b0: 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20  .tcl script has 
52c0: 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e  so arranged thin
52d0: 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79  gs that the only
52e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
52f0: 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73  non-jump opcodes
5300: 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54   less than SQLIT
5310: 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61  E_MX_JUMP_CODE a
5320: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
5330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
5340: 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  have non-negativ
5350: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e  e values for P2.
5360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5370: 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33  assert( (sqlite3
5380: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
5390: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
53a0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a  FLG_JUMP)!=0 );.
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
53c0: 72 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32  rt( ADDR(pOp->p2
53d0: 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  )<pParse->nLabel
53e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
53f0: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
5400: 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b  [ADDR(pOp->p2)];
5410: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f        /* The mko
5450: 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70  pcodeh.tcl scrip
5460: 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65  t has so arrange
5470: 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68  d things that th
5480: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  e only.      ** 
5490: 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73  non-jump opcodes
54a0: 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54   less than SQLIT
54b0: 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61  E_MX_JUMP_CODE a
54c0: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
54d0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e  .      ** have n
54e0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
54f0: 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20  es for P2. */.  
5500: 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c      assert( (sql
5510: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
5520: 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26  ty[pOp->opcode]&
5530: 4f 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c  OPFLG_JUMP)==0 |
5540: 7c 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20  | pOp->p2>=0);. 
5550: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
5560: 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b  ==p->aOp ) break
5570: 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d  ;.    pOp--;.  }
5580: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5590: 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  (p->db, pParse->
55a0: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73  aLabel);.  pPars
55b0: 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->aLabel = 0;. 
55c0: 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20   pParse->nLabel 
55d0: 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63  = 0;.  *pMaxFunc
55e0: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
55f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
5600: 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62  sReader!=0 || Db
5610: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
5620: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a  treeMask) );.}..
5630: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5640: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
5650: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
5660: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
5670: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5680: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
5690: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
56a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
56b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
56c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
56d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  .}../*.** Verify
56e0: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e   that at least N
56f0: 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72   opcode slots ar
5700: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  e available in p
5710: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5720: 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ng to malloc for
5730: 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63   more space (exc
5740: 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ept when compile
5750: 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  d using.** SQLIT
5760: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
5770: 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e  TRESS).  This in
5780: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
5790: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a  during testing.*
57a0: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
57b0: 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74   certain calls t
57c0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  o sqlite3VdbeAdd
57d0: 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76  OpList() can nev
57e0: 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74  er.** fail due t
57f0: 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e  o a OOM fault an
5800: 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65  d hence that the
5810: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
5820: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
5830: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c  eAddOpList() wil
5840: 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d  l always be non-
5850: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  NULL..*/.#if def
5860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5870: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
5880: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
5890: 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20  OC_STRESS).void 
58a0: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
58b0: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
58c0: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e  d(Vdbe *p, int N
58d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
58e0: 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50  nOp + N <= p->pP
58f0: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  arse->nOpAlloc )
5900: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5910: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
5920: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
5930: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5940: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5950: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
5960: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
5970: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
5980: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
5990: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
59a0: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
59b0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
59c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
59d0: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
59e0: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
59f0: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
5a00: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
5a10: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
5a20: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
5a30: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5a40: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
5a50: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
5a60: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
5a70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
5a80: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
5a90: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5aa0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
5ab0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
5ac0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
5ad0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
5ae0: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
5af0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5b00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
5b10: 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72  a single OP_Abor
5b20: 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68  table opcode) th
5b30: 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66  at will.** verif
5b40: 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  y that the VDBE 
5b50: 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65  program can safe
5b60: 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e  ly call Abort in
5b70: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
5b80: 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20  context..*/.#if 
5b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5ba0: 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74  EBUG).void sqlit
5bb0: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
5bc0: 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69  table(Vdbe *p, i
5bd0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69  nt onError){.  i
5be0: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
5bf0: 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64  bort ) sqlite3Vd
5c00: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41  beAddOp0(p, OP_A
5c10: 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e  bortable);.}.#en
5c20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
5c30: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5c40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5c50: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
5c60: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
5c70: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
5c80: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5c90: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
5ca0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
5cb0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
5cc0: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
5cd0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
5ce0: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
5cf0: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
5d00: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
5d10: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
5d20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
5d30: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
5d40: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
5d50: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
5d60: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
5d70: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
5d80: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
5d90: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
5da0: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
5db0: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
5dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
5dd0: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
5de0: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
5df0: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
5e00: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
5e10: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
5e20: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5e30: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
5e40: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
5e50: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
5e60: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
5e70: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
5e80: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
5e90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5ea0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
5eb0: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
5ec0: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
5ed0: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
5ee0: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
5ef0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
5f00: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
5f10: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
5f20: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
5f30: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
5f40: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
5f50: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
5f70: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
5f80: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
5f90: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
5fa0: 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   Return a.** poi
5fb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
5fc0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
5fd0: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d  rted..**.** Non-
5fe0: 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74  zero P2 argument
5ff0: 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75  s to jump instru
6000: 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d  ctions are autom
6010: 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65  atically adjuste
6020: 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  d.** so that the
6030: 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20   jump target is 
6040: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
6050: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
6060: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
6070: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6080: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
6090: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
60a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
60b0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
60c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
60d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6100: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
6110: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
6120: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
6130: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6140: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
6150: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
6180: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
6190: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
61a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
61b0: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
61c0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
61d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
61e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
61f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6200: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
6210: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
6220: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
6230: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
6240: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6250: 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75  }.  pFirst = pOu
6260: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  t = &p->aOp[p->n
6270: 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Op];.  for(i=0; 
6280: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b  i<nOp; i++, aOp+
6290: 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20  +, pOut++){.    
62a0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61  pOut->opcode = a
62b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
62c0: 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e  pOut->p1 = aOp->
62d0: 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32  p1;.    pOut->p2
62e0: 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = aOp->p2;.    
62f0: 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e  assert( aOp->p2>
6300: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73  =0 );.    if( (s
6310: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
6320: 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65  erty[aOp->opcode
6330: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
6340: 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20  =0 && aOp->p2>0 
6350: 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  ){.      pOut->p
6360: 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  2 += p->nOp;.   
6370: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20   }.    pOut->p3 
6380: 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70  = aOp->p3;.    p
6390: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
63a0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f  _NOTUSED;.    pO
63b0: 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  ut->p4.p = 0;.  
63c0: 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a    pOut->p5 = 0;.
63d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
63e0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
63f0: 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e  MENTS.    pOut->
6400: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
6410: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
6420: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6430: 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c  .    pOut->iSrcL
6440: 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b  ine = iLineno+i;
6450: 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64  .#else.    (void
6460: 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66  )iLineno;.#endif
6470: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6480: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e  EBUG.    if( p->
6490: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
64a0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
64b0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
64c0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
64d0: 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61   i+p->nOp, &p->a
64e0: 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20  Op[i+p->nOp]);. 
64f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
6500: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
6510: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74  .  return pFirst
6520: 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
6530: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
6540: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a  TMT_SCANSTATUS).
6550: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74  /*.** Add an ent
6560: 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  ry to the array 
6570: 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61  of counters mana
6580: 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73  ged by sqlite3_s
6590: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29  tmt_scanstatus()
65a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
65b0: 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28  3VdbeScanStatus(
65c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20     /* VM to add 
65f0: 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20  scanstatus() to 
6600: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70  */.  int addrExp
6610: 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lain,           
6620: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6630: 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f  of OP_Explain (o
6640: 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  r 0) */.  int ad
6650: 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  drLoop,         
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6670: 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75  ress of loop cou
6680: 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61  nter */ .  int a
6690: 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20  ddrVisit,       
66a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
66b0: 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69  dress of rows vi
66c0: 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f  sited counter */
66d0: 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20  .  LogEst nEst, 
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
6700: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
6710: 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74   rows */.  const
6720: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
6730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6740: 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69  me of table or i
6750: 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e  ndex being scann
6760: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ed */.){.  int n
6770: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e  Byte = (p->nScan
6780: 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61  +1) * sizeof(Sca
6790: 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e  nStatus);.  Scan
67a0: 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20  Status *aNew;.  
67b0: 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74  aNew = (ScanStat
67c0: 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61  us*)sqlite3DbRea
67d0: 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lloc(p->db, p->a
67e0: 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Scan, nByte);.  
67f0: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
6800: 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77  ScanStatus *pNew
6810: 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61   = &aNew[p->nSca
6820: 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n++];.    pNew->
6830: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64  addrExplain = ad
6840: 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70  drExplain;.    p
6850: 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20  New->addrLoop = 
6860: 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e  addrLoop;.    pN
6870: 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20  ew->addrVisit = 
6880: 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70  addrVisit;.    p
6890: 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74  New->nEst = nEst
68a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ;.    pNew->zNam
68b0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
68c0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Dup(p->db, zName
68d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20  );.    p->aScan 
68e0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65  = aNew;.  }.}.#e
68f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
6900: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
6910: 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20   the opcode, or 
6920: 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50  P1, P2, P3, or P
6930: 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f  5 operands.** fo
6940: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
6950: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6960: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6970: 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  ngeOpcode(Vdbe *
6980: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20  p, u32 addr, u8 
6990: 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73  iNewOpcode){.  s
69a0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
69b0: 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20  p,addr)->opcode 
69c0: 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a  = iNewOpcode;.}.
69d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
69e0: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
69f0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
6a00: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
6a10: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
6a20: 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p1 = val;.}.vo
6a30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
6a40: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
6a50: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
6a60: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
6a70: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
6a80: 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p2 = val;.}.void
6a90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6aa0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
6ab0: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
6ac0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
6ad0: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33  etOp(p,addr)->p3
6ae0: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
6af0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6b00: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20  P5(Vdbe *p, u16 
6b10: 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  p5){.  assert( p
6b20: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62  ->nOp>0 || p->db
6b30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6b40: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  ;.  if( p->nOp>0
6b50: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70   ) p->aOp[p->nOp
6b60: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a  -1].p5 = p5;.}..
6b70: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6b80: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
6b90: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
6ba0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
6bb0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
6bc0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
6bd0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
6be0: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
6bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6c00: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
6c10: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
6c20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
6c30: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
6c40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6c50: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
6c60: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
6c70: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
6c80: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
6c90: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
6ca0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
6cb0: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
6cc0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
6cd0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
6ce0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
6cf0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
6d00: 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
6d10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
6d20: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
6d30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6d40: 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20  NN(db, pDef);.  
6d50: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
6d60: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
6d70: 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a  (sqlite3 *, Op *
6d80: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  , int);../*.** D
6d90: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
6da0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6db0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
6dc0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
6dd0: 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20  eeP4Mem(sqlite3 
6de0: 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20  *db, Mem *p){.  
6df0: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
6e00: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
6e10: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
6e20: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
6e30: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
6e40: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
6e50: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46  INE void freeP4F
6e60: 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a  uncCtx(sqlite3 *
6e70: 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  db, sqlite3_cont
6e80: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45  ext *p){.  freeE
6e90: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
6ea0: 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a  (db, p->pFunc);.
6eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
6ec0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  (db, p);.}.stati
6ed0: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
6ee0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
6ef0: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
6f00: 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  {.  assert( db )
6f10: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79  ;.  switch( p4ty
6f20: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
6f30: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
6f40: 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78     freeP4FuncCtx
6f50: 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f  (db, (sqlite3_co
6f60: 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20  ntext*)p4);.    
6f70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6f80: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
6f90: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6fa0: 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  64:.    case P4_
6fb0: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73  DYNAMIC:.    cas
6fc0: 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20  e P4_DYNBLOB:.  
6fd0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6fe0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6ff0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
7000: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7010: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7020: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7030: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
7040: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
7050: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
7060: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
7070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7080: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7090: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
70a0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
70b0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
70c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
70d0: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
70e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
70f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
7100: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7110: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
7120: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
7130: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
7140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7150: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7160: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
7170: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7180: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
7190: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
71a0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
71b0: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
71c0: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
71d0: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
71e0: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
71f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7200: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
7210: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7220: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7230: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
7240: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
7250: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7270: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
7280: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
7290: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
72a0: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
72b0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
72c0: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
72d0: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
72e0: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
72f0: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
7300: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
7310: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
7320: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
7330: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
7340: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
7350: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
7360: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
7370: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
7380: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
7390: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
73a0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
73b0: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
73c0: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
73d0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
73e0: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
73f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7400: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
7410: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7420: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
7430: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
7440: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7450: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
7460: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7470: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
7480: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
7490: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
74a0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
74b0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
74c0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
74d0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
74e0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
74f0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
7500: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
7510: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
7520: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
7530: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7540: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
7550: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
7560: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
7570: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
7580: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
7590: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
75a0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
75b0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
75c0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
75d0: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
75e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
75f0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
7600: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
7610: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
7620: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
7640: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
7650: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
7660: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
7670: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
7680: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
7690: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
76a0: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
76b0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
76c0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
76d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
76e0: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
76f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
7700: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
7710: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
7720: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
7730: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
7740: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
7750: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
7760: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
7770: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
7780: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7790: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
77a0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
77b0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
77c0: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
77d0: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
77e0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
77f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7800: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
7810: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
7820: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7840: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
7850: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
7860: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
7870: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
7880: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
7890: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
78a0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
78b0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
78c0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
78d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
78e0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
78f0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
7900: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
7910: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
7920: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
7930: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
7940: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
7950: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
7960: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
7970: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
7980: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
7990: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
79a0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
79b0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
79c0: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
79d0: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
79e0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
79f0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
7a00: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
7a10: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
7a20: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
7a30: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
7a40: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
7a50: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
7a60: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
7a70: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
7a80: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
7a90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
7aa0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
7ab0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
7ac0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
7ad0: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
7ae0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
7af0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
7b00: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
7b10: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
7b20: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
7b30: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
7b40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
7b50: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
7b60: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
7b70: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
7b80: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
7b90: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
7ba0: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
7bb0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
7bc0: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
7bd0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
7be0: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
7bf0: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
7c00: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
7c10: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
7c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7c30: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
7c40: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
7c50: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
7c60: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
7c70: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7c80: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
7c90: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
7ca0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
7cb0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
7cc0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
7cd0: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
7ce0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7cf0: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
7d00: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
7d10: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
7d20: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
7d30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
7d40: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
7d50: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7d60: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
7d70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
7d80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7d90: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
7da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7db0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7dc0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
7dd0: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
7de0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
7df0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
7e00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7e10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
7e20: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
7e30: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
7e40: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
7e50: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
7e60: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
7e70: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
7e80: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
7e90: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
7ea0: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
7eb0: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
7ec0: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
7ed0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
7ee0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
7ef0: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
7f00: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
7f10: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
7f20: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
7f30: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
7f40: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
7f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
7f60: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
7f70: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
7f80: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
7f90: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
7fa0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
7fb0: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
7fc0: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
7fd0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
7fe0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
7ff0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
8000: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
8010: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
8020: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
8030: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
8040: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8050: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
8060: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
8070: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
8080: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
8090: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
80a0: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
80b0: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
80c0: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
80d0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
80e0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
80f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
8100: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
8110: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
8120: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
8130: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
8140: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
8150: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
8160: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
8170: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
8180: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
8190: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
81a0: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
81b0: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
81c0: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
81d0: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
81e0: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
81f0: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
8200: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
8210: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
8220: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
8230: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
8240: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
8250: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
8260: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8270: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
8280: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
8290: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
82a0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
82b0: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
82c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
82d0: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
82e0: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
82f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8300: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8310: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
8320: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
8330: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
8340: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
8350: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
8360: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
8370: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
8380: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
8390: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
83a0: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
83b0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
83c0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
83d0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
83e0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
83f0: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
8400: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
8410: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
8420: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
8430: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
8440: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
8450: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8460: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
8470: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
8480: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
8490: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
84a0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
84b0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
84c0: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
84d0: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
84e0: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
84f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
8500: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
8510: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
8520: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
8530: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
8540: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
8550: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
8560: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
8570: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
8580: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8590: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
85a0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
85b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
85c0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
85d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
85e0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
85f0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
8600: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
8610: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8620: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
8630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
8640: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
8650: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
8660: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
8670: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
8680: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
8690: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
86a0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
86b0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
86c0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
86d0: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
86e0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
86f0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
8700: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
8710: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
8720: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
8730: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
8740: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
8750: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
8760: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
8770: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
8780: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
8790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
87a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
87b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
87c0: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
87d0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
87e0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
87f0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8800: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
8810: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
8820: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
8830: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
8840: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
8850: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8860: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
8870: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
8880: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
8890: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
88a0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
88b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
88c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
88d0: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
88e0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
88f0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
8900: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
8910: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
8920: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8930: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
8940: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
8950: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
8960: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
8970: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
8980: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
8990: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
89a0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
89b0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
89c0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
89d0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
89e0: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
89f0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
8a00: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
8a10: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
8a20: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
8a30: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
8a40: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
8a50: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
8a60: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
8a70: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
8a80: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
8a90: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
8aa0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
8ab0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
8ac0: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
8ad0: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
8ae0: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
8af0: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
8b00: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
8b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
8b20: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
8b30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8b40: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
8b50: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
8b60: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
8b70: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
8b80: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
8b90: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
8ba0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
8bb0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
8bc0: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
8bd0: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
8be0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
8bf0: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
8c00: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
8c10: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
8c20: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
8c30: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
8c40: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
8c50: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
8c60: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
8c70: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
8c80: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
8c90: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
8ca0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
8cb0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
8cc0: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
8cd0: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
8ce0: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
8cf0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8d00: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
8d10: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
8d20: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
8d30: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
8d40: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
8d50: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
8d60: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
8d70: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8d80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8d90: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
8da0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
8db0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
8dc0: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
8dd0: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
8de0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8df0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8e00: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
8e10: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
8e20: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
8e30: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
8e40: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
8e50: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
8e60: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
8e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
8e80: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
8e90: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
8ea0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
8eb0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
8ec0: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
8ed0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
8ee0: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
8ef0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
8f00: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
8f10: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
8f20: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
8f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8f40: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
8f50: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
8f60: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
8f70: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
8f80: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
8f90: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
8fa0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
8fb0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
8fc0: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
8fd0: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
8fe0: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
8ff0: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
9000: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
9010: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
9020: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
9030: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
9040: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
9050: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
9060: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
9070: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
9080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
9090: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
90a0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
90b0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
90c0: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
90d0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
90e0: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
90f0: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
9100: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
9110: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
9120: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
9130: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
9140: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9150: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
9160: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
9170: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
9180: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
9190: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
91a0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
91b0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
91c0: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
91d0: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
91e0: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
91f0: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
9200: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
9210: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
9220: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9230: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
9240: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
9250: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
9260: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9270: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
9280: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
9290: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
92a0: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
92b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
92c0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
92d0: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
92e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
92f0: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
9300: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
9310: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
9320: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
9330: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
9340: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
9350: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
9360: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9370: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
9380: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
9390: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
93a0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
93b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
93c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
93d0: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
93e0: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
93f0: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9410: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9420: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9430: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
9440: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
9450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9460: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
9470: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
9480: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
9490: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
94a0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
94b0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
94c0: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
94d0: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
94e0: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
94f0: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
9500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9510: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
9520: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
9530: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
9540: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
9550: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9560: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9570: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9580: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
9590: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
95a0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
95b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
95c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
95d0: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
95e0: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
95f0: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
9600: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9610: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
9620: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
9630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
9640: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
9650: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
9660: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9670: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
9680: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
9690: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
96a0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
96b0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
96c0: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
96d0: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
96e0: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
96f0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
9700: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
9720: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
9730: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
9740: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9750: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
9760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9770: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9780: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9790: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
97a0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
97b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
97c0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
97d0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
97e0: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
97f0: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
9800: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
9810: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
9820: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9830: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
9840: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
9850: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9860: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
9870: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
9880: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
9890: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
98a0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
98b0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
98c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
98d0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
98e0: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
98f0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
9900: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
9910: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
9920: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
9930: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
9940: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
9950: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
9960: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
9970: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9980: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
9990: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
99a0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
99b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
99c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
99d0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
99e0: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
99f0: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
9a00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
9a10: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
9a20: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
9a30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9a40: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
9a50: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
9a60: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
9a70: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
9a80: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
9a90: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
9aa0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
9ab0: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
9ac0: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
9ad0: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
9ae0: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
9af0: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
9b00: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
9b10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9b20: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
9b30: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9b40: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
9b50: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
9b60: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
9b70: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
9b80: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
9b90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9ba0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
9bb0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
9bc0: 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78  ndf(p, "%d", pEx
9bd0: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
9be0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9bf0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
9c10: 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c  appendf(p, "NULL
9c20: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
9c30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
9c40: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
9c50: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
9c60: 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  df(p, "r[%d]", p
9c70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
9c80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c90: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
9ca0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
9cb0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9cc0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
9cd0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
9ce0: 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  f(p, "rowid");. 
9cf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
9d10: 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22  appendf(p, "c%d"
9d20: 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43  , (int)pExpr->iC
9d30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
9d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9d50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
9d60: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  T:      zOp = "L
9d70: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
9d80: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
9d90: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b       zOp = "LE";
9da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9db0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
9dc0: 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20    zOp = "GT";   
9dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9de0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
9df0: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20  Op = "GE";      
9e00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9e10: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_NE:      zOp 
9e20: 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65  = "NE";      bre
9e30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e40: 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  EQ:      zOp = "
9e50: 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  EQ";      break;
9e60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
9e70: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22        zOp = "IS"
9e80: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9e90: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
9ea0: 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22     zOp = "ISNOT"
9eb0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9ec0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
9ed0: 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  zOp = "AND";    
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ef0: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70   TK_OR:      zOp
9f00: 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72   = "OR";      br
9f10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9f20: 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20  _PLUS:    zOp = 
9f30: 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "ADD";     break
9f40: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
9f50: 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55  AR:    zOp = "MU
9f60: 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
9f70: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
9f80: 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b  :   zOp = "SUB";
9f90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9fa0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
9fb0: 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20   zOp = "REM";   
9fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9fd0: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f  e TK_BITAND:  zO
9fe0: 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62  p = "BITAND";  b
9ff0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a000: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d  K_BITOR:   zOp =
a010: 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61   "BITOR";   brea
a020: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
a030: 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44  LASH:   zOp = "D
a040: 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IV";     break;.
a050: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
a060: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49  FT:  zOp = "LSHI
a070: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
a080: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
a090: 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22    zOp = "RSHIFT"
a0a0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
a0b0: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
a0c0: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20  Op = "CONCAT";  
a0d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a0e0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20  TK_UMINUS:  zOp 
a0f0: 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65  = "MINUS";   bre
a100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a110: 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  UPLUS:   zOp = "
a120: 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b  PLUS";    break;
a130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a140: 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  NOT:  zOp = "BIT
a150: 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
a160: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
a170: 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20     zOp = "NOT"; 
a180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a190: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
a1a0: 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  zOp = "ISNULL"; 
a1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a1c0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70   TK_NOTNULL: zOp
a1d0: 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
a1e0: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
a1f0: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
a200: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a210: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
a220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a230: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
a240: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a250: 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20  pendf(p, "%s(", 
a260: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
a270: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
a280: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
a290: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
a2a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a2b0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
a2c0: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
a2d0: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
a2e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a2f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a300: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
a310: 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  )", 1);.  }.}.#e
a320: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
a330: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
a340: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
a350: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a  _CURSOR_HINTS) *
a360: 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  /...#if VDBE_DIS
a370: 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f  PLAY_P4./*.** Co
a380: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
a390: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
a3a0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
a3b0: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
a3c0: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
a3d0: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
a3e0: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
a3f0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
a400: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
a410: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
a420: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
a430: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
a440: 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  emp;.  StrAccum 
a450: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  x;.  assert( nTe
a460: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69  mp>=20 );.  sqli
a470: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
a480: 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54  &x, 0, zTemp, nT
a490: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63  emp, 0);.  switc
a4a0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
a4b0: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
a4c0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
a4d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  nt j;.      KeyI
a4e0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
a4f0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
a500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a510: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
a520: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
a530: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a540: 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  endf(&x, "k(%d",
a550: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
a560: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ield);.      for
a570: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
a580: 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b  ->nKeyField; j++
a590: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
a5a0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
a5b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
a5c0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a5d0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
a5e0: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
a5f0: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
a600: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
a610: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
a620: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
a630: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a640: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25  _appendf(&x, ",%
a650: 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%s", .         
a660: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
a670: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20  aSortOrder[j] ? 
a680: 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29  "-" : "", zColl)
a690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a6a0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a6b0: 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a  nd(&x, ")", 1);.
a6c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a6d0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a6e0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
a6f0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
a700: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
a710: 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c  isplayP4Expr(&x,
a720: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b   pOp->p4.pExpr);
a730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a740: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
a750: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
a760: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
a770: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
a780: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
a790: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a7a0: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
a7b0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
a7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
a7e0: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
a7f0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
a800: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
a810: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a820: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
a830: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
a840: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
a850: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a860: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
a870: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
a880: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
a890: 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20  OFILE).    case 
a8a0: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
a8b0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
a8c0: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
a8d0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
a8e0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a8f0: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
a900: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
a910: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
a920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
a930: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
a940: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
a950: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a960: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
a970: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
a980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a990: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
a9a0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
a9b0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a9c0: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
a9d0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
a9e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a9f0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
aa00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
aa10: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
aa20: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
aa30: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
aa40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
aa50: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
aa60: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
aa70: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
aa80: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
aa90: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
aaa0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
aab0: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
aac0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
aad0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
aae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
aaf0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
ab00: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
ab10: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
ab20: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
ab30: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
ab40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
ab50: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
ab60: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
ab70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ab80: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
ab90: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
aba0: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
abb0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
abc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
abe0: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
abf0: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
ac00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ac10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ac20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ac30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ac40: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
ac50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ac60: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
ac70: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
ac80: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
ac90: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
aca0: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
acb0: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
acc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
acd0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
ace0: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
acf0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
ad00: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
ad10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
ad20: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
ad30: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
ad40: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
ad50: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
ad80: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
ad90: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
ada0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
adb0: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <=n; i++){.     
adc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
add0: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22  ppendf(&x, ",%d"
ade0: 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ai[i]);.      
adf0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  }.      zTemp[0]
ae00: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71   = '[';.      sq
ae10: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
ae20: 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20  (&x, "]", 1);.  
ae30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ae40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
ae50: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
ae60: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ae70: 65 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61  endf(&x, "progra
ae80: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
ae90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
aea0: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
aeb0: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
aec0: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
aed0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
aee0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
aef0: 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a  ase P4_TABLE: {.
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
af10: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
af20: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  s", pOp->p4.pTab
af30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
af40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
af50: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
af60: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
af70: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
af80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
af90: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
afa0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
afb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
afc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
afd0: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
afe0: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
aff0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
b000: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
b010: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
b020: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
b030: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
b040: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
b050: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
b060: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
b070: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
b080: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
b090: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
b0a0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
b0b0: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
b0c0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
b0d0: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
b0e0: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
b0f0: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
b100: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
b110: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
b120: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
b130: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
b140: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
b150: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
b160: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
b170: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
b180: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
b190: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
b1a0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
b1b0: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
b1c0: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
b1d0: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
b1e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
b1f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
b200: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
b210: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
b220: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
b230: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
b240: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
b250: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
b260: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
b270: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
b280: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
b290: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b2a0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
b2b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  E)./*.** If SQLi
b2c0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
b2d0: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
b2e0: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
b2f0: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
b300: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
b310: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
b320: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
b330: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
b340: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
b350: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
b360: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
b370: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
b380: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
b390: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
b3a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
b3b0: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
b3c0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
b3d0: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
b3e0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
b3f0: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
b400: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
b410: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
b420: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
b430: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
b440: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
b450: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
b460: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
b470: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
b480: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
b490: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
b4a0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
b4b0: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
b4c0: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
b4d0: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
b4e0: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
b4f0: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
b500: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b510: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
b520: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
b530: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
b540: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
b550: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
b560: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
b570: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
b580: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
b590: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
b5a0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
b5b0: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
b5c0: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
b5d0: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
b5e0: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
b5f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
b600: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
b610: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
b620: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
b630: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
b640: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
b650: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
b660: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
b670: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
b680: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
b690: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
b6a0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
b6b0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
b6c0: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
b6d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
b6e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
b6f0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
b700: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
b710: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
b720: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
b730: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
b740: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
b750: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
b760: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
b770: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
b780: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
b790: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
b7a0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
b7b0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
b7c0: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
b7d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b7e0: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
b7f0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
b800: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
b810: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b820: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
b830: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
b840: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
b850: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
b860: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
b870: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
b880: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b890: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
b8a0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
b8b0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
b8c0: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
b8d0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
b8e0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
b8f0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
b900: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
b910: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
b920: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
b930: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
b940: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
b950: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
b960: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
b970: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
b980: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
b990: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b9a0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
b9b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
b9c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
b9d0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
b9e0: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
b9f0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
ba00: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
ba10: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
ba20: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
ba30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
ba40: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
ba50: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
ba60: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
ba70: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
ba80: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
ba90: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
baa0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
bab0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
bac0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
bad0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
bae0: 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a  , VdbeOp *pOp){.
baf0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
bb00: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
bb10: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
bb20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
bb30: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
bb40: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
bb50: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
bb60: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
bb70: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
bb80: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
bb90: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
bba0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
bbb0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
bbc0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
bbd0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
bbe0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
bbf0: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
bc00: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
bc10: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
bc20: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
bc30: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
bc40: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
bc50: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
bc60: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
bc70: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
bc80: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
bc90: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
bca0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
bcb0: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
bcc0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
bcd0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
bce0: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
bcf0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
bd00: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
bd10: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
bd20: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
bd30: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
bd40: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
bd50: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
bd60: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
bd70: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
bd80: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
bd90: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
bda0: 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   element..*/.sta
bdb0: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d  tic void initMem
bdc0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
bdd0: 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  t N, sqlite3 *db
bde0: 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20  , u16 flags){.  
bdf0: 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29  while( (N--)>0 )
be00: 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  {.    p->db = db
be10: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
be20: 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73   flags;.    p->s
be30: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66  zMalloc = 0;.#if
be40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
be50: 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72  .    p->pScopyFr
be60: 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  om = 0;.#endif. 
be70: 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f     p++;.  }.}../
be80: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
be90: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
bea0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
beb0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
bec0: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
bed0: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
bee0: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
bef0: 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20  pEnd = &p[N];.  
bf00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bf10: 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64  p->db;.    if( d
bf20: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
bf30: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
bf40: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
bf50: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
bf60: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
bf70: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  loc);.      }whi
bf80: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
bf90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
bfa0: 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
bfb0: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
bfc0: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
bfd0: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
bfe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
bff0: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
c000: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
c010: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
c020: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
c030: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
c040: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
c050: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
c060: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
c070: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
c080: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
c090: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
c0a0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
c0b0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
c0c0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
c0d0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
c0e0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
c0f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
c100: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
c110: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
c120: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
c130: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
c140: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
c150: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
c160: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
c170: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
c180: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
c190: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
c1a0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
c1b0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
c1c0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
c1d0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
c1e0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
c1f0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
c200: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
c210: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
c220: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
c230: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
c240: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
c250: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
c260: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
c270: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
c280: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
c290: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
c2a0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
c2b0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
c2c0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
c2d0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
c2e0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
c2f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
c300: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
c310: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c320: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
c330: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
c340: 73 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d  stcase( p->xDel=
c350: 3d 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d  =sqlite3VdbeFram
c360: 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20  eMemDel );.     
c370: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
c380: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20  EM_Agg|MEM_Dyn) 
c390: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c3a0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
c3b0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
c3c0: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
c3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c3e0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
c3f0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
c400: 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63       p->szMalloc
c410: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
c420: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
c430: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
c440: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
c450: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  <pEnd );.  }.}..
c460: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
c470: 42 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  BUG./*.** Verify
c480: 20 74 68 61 74 20 70 46 72 61 6d 65 20 69 73 20   that pFrame is 
c490: 61 20 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d  a valid VdbeFram
c4a0: 65 20 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75  e pointer.  Retu
c4b0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
c4c0: 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66  .** and false if
c4d0: 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72   something is wr
c4e0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ong..**.** This 
c4f0: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e  routine is inten
c500: 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69  ded for use insi
c510: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
c520: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a  tatements only..
c530: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c540: 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56  beFrameIsValid(V
c550: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
c560: 29 7b 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d  ){.  if( pFrame-
c570: 3e 69 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51  >iFrameMagic!=SQ
c580: 4c 49 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43  LITE_FRAME_MAGIC
c590: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
c5a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
c5b0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  f.../*.** This i
c5c0: 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f  s a destructor o
c5d0: 6e 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28  n a Mem object (
c5e0: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
c5f0: 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
c600: 29 0a 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65  ).** that delete
c610: 73 20 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65  s the Frame obje
c620: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
c630: 68 65 64 20 74 6f 20 69 74 20 61 73 20 61 20 62  hed to it as a b
c640: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lob..**.** This 
c650: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
c660: 20 64 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d   delete the Fram
c670: 65 20 72 69 67 68 74 20 61 77 61 79 2e 20 20 49  e right away.  I
c680: 74 20 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68  t merely adds th
c690: 65 0a 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20  e.** frame to a 
c6a0: 6c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  list of frames t
c6b0: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  o be deleted whe
c6c0: 6e 20 74 68 65 20 56 64 62 65 20 68 61 6c 74 73  n the Vdbe halts
c6d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c6e0: 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c  3VdbeFrameMemDel
c6f0: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
c700: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
c710: 65 20 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29  e = (VdbeFrame*)
c720: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
c730: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
c740: 49 73 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20  IsValid(pFrame) 
c750: 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61  );.  pFrame->pPa
c760: 72 65 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76  rent = pFrame->v
c770: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70  ->pDelFrame;.  p
c780: 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72  Frame->v->pDelFr
c790: 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a  ame = pFrame;.}.
c7a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
c7b0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
c7c0: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
c7d0: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
c7e0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
c7f0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
c800: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
c810: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
c820: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
c830: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
c840: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
c850: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
c860: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
c870: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
c880: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
c890: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
c8a0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
c8b0: 64 4d 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28  dMem];.  assert(
c8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
c8d0: 65 49 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20  eIsValid(p) );. 
c8e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
c8f0: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
c900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
c910: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
c920: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
c930: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c940: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
c950: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Mem);.  sqlite3V
c960: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
c970: 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70  (p->v->db, &p->p
c980: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
c990: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
c9a0: 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d  (p->v->db, p);.}
c9b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c9c0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
c9d0: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
c9e0: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
c9f0: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
ca00: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
ca10: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
ca20: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
ca30: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
ca40: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
ca50: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
ca60: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
ca70: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
ca80: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
ca90: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
caa0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
cab0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
cac0: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
cad0: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
cae0: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
caf0: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
cb00: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
cb10: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
cb20: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
cb30: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
cb40: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
cb50: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
cb60: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
cb70: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
cb80: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
cb90: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
cba0: 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30   PLAN..** 2018-0
cbb0: 34 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70  4-24:  In p->exp
cbc0: 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68  lain==2 mode, th
cbd0: 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65  e OP_Init opcode
cbe0: 73 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a  s of triggers.**
cbf0: 20 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c   are also shown,
cc00: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75   so that the bou
cc10: 6e 64 61 72 69 65 73 20 62 65 74 77 65 65 6e 20  ndaries between 
cc20: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
cc30: 20 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69   and.** each tri
cc40: 67 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a  gger are clear..
cc50: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
cc60: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
cc70: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
cc80: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
cc90: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
cca0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
ccb0: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
ccc0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
ccd0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
cce0: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd00: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
cd10: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
cd40: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
cd50: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
cd60: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cd90: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
cda0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
cdb0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
cdc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cdd0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
cde0: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
cdf0: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
ce20: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
ce30: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
ce40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
ce50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
ce60: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
ce70: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
ce80: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ceb0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
cec0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
cef0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
cf00: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
cf10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
cf20: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
cf30: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62  t set */.  int b
cf40: 4c 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28  ListSubprogs = (
cf50: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c  p->explain==1 ||
cf60: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
cf70: 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51 50 29  LITE_TriggerEQP)
cf80: 21 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20  !=0);.  Op *pOp 
cf90: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
cfa0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
cfb0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
cfc0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
cfd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
cfe0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
cff0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
d000: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
d010: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
d020: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
d030: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
d040: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
d050: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
d060: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
d070: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
d080: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
d090: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
d0a0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
d0b0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
d0c0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
d0d0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
d0e0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
d0f0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
d100: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
d110: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
d120: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
d130: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
d140: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
d150: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
d160: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
d170: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
d180: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
d190: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
d1a0: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
d1b0: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
d1c0: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
d1d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d1e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
d1f0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
d200: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
d210: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
d220: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
d230: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
d240: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
d250: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
d260: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d270: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
d280: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
d290: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d2a0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
d2b0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
d2c0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
d2d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
d2e0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
d2f0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
d300: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
d310: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
d320: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
d330: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
d340: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
d350: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
d360: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
d370: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
d380: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
d390: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
d3a0: 70 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75  p;.  if( bListSu
d3b0: 62 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a  bprogs ){.    /*
d3c0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
d3d0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
d3e0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
d3f0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
d400: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
d410: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
d420: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
d430: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
d440: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
d450: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
d460: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
d470: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
d480: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
d490: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
d4a0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
d4b0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
d4c0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
d4d0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
d4e0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
d4f0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
d500: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
d510: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
d520: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
d530: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
d540: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
d550: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
d560: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
d570: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
d580: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
d590: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
d5a0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
d5b0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
d5c0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
d5d0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
d5e0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
d5f0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
d600: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
d610: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
d620: 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31  }.  }..  while(1
d630: 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74  ){  /* Loop exit
d640: 73 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20  s via break */. 
d650: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
d660: 20 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20      if( i>=nRow 
d670: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
d680: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d690: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
d6a0: 4e 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  NE;.      break;
d6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d6c0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
d6d0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
d6e0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
d6f0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
d700: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
d710: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
d720: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
d730: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
d740: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
d750: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
d760: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
d770: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
d780: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
d790: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
d7a0: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
d7b0: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
d7c0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
d7d0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
d7e0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
d7f0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
d800: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
d810: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
d820: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
d830: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
d840: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
d850: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68      }..    /* Wh
d860: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
d870: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
d880: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
d890: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
d8a0: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
d8b0: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
d8c0: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
d8d0: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
d8e0: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
d8f0: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
d900: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
d910: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
d920: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
d930: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
d940: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
d950: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
d960: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69    */.    if( bLi
d970: 73 74 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f  stSubprogs && pO
d980: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
d990: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
d9a0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
d9b0: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
d9c0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
d9d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
d9e0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
d9f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
da00: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
da10: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
da20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
da30: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
da40: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
da50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
da60: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
da70: 65 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20  e, nSub!=0);.   
da80: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
da90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
daa0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
dab0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
dac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dad0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53     }.        apS
dae0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
daf0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
db00: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
db10: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
db20: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70  ogram;.        p
db30: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Sub->flags |= ME
db40: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  M_Blob;.        
db50: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
db60: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
db70: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77  *);.        nRow
db80: 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f   += pOp->p4.pPro
db90: 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  gram->nOp;.     
dba0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
dbb0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20   p->explain<2 ) 
dbc0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
dbd0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
dbe0: 78 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a  xplain ) break;.
dbf0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
dc00: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
dc10: 70 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b  p->pc>1 ) break;
dc20: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
dc30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dc40: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
dc50: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
dc60: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
dc70: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
dc80: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
dc90: 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
dca0: 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
dcb0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
dcc0: 3e 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >rc));.    }else
dcd0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
dce0: 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  4;.      if( p->
dcf0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
dd00: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
dd10: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
dd20: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
dd30: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
dd60: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  unter */.       
dd70: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20   pMem++;.    .  
dd80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
dd90: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
dda0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
ddb0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
ddc0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
ddd0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
dde0: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
ddf0: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ode */.        a
de00: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
de10: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 );.        pMe
de20: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
de30: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
de40: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
de50: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
de60: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ;.        pMem++
de70: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
de80: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
de90: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
dea0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
deb0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ded0: 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  1 */.      pMem+
dee0: 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  +;..      pMem->
def0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
df00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
df10: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
df40: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
df50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
df60: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
df70: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
df80: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dfa0: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P3 */.      pMe
dfb0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m++;..      if( 
dfc0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
dfd0: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
dfe0: 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34  m, 100) ){ /* P4
dff0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
e000: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
e010: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
e020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e030: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
e040: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e050: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
e060: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20  Term;.      zP4 
e070: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
e080: 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e   pMem->z, pMem->
e090: 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  szMalloc);.     
e0a0: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
e0b0: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  z ){.        pMe
e0c0: 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
e0d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
e0e0: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34  SetStr(pMem, zP4
e0f0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
e100: 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  8, 0);.      }el
e110: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
e120: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
e130: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
e140: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
e150: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
e160: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
e170: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
e180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
e190: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m++;..      if( 
e1a0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
e1b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
e1c0: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
e1d0: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
e1e0: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4) ){.          
e1f0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
e200: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e220: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
e230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e240: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e250: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
e260: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
e270: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 2;.        sql
e280: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
e290: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
e2a0: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
e2b0: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70   P5 */.        p
e2c0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
e2d0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20  E_UTF8;.        
e2e0: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66  pMem++;.    .#if
e2f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e300: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
e310: 54 53 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  TS.        if( s
e320: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
e330: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
e340: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
e350: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
e360: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
e380: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e3a0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e3b0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
e3c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
e3d0: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
e3e0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
e3f0: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
e400: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
e410: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
e420: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65  else.        pMe
e430: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
e440: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
e450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
e460: 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  mment */.#endif.
e470: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
e480: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
e490: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
e4a0: 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  -1);.      p->pR
e4b0: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
e4c0: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d  Mem[1];.      p-
e4d0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
e4e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e4f0: 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20  TE_ROW;.    }.  
e500: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e510: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e520: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
e530: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
e540: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
e550: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
e560: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
e570: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
e580: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
e590: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
e5a0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e  (Vdbe *p){.  con
e5b0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  st char *z = 0;.
e5c0: 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
e5d0: 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c  .    z = p->zSql
e5e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
e5f0: 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63  >nOp>=1 ){.    c
e600: 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70  onst VdbeOp *pOp
e610: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
e620: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
e630: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
e640: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
e650: 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34       z = pOp->p4
e660: 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  .z;.      while(
e670: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
e680: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
e690: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70  .  }.  if( z ) p
e6a0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
e6b0: 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69  \n", z);.}.#endi
e6c0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
e6d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
e6e0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
e6f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
e700: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
e710: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
e720: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
e730: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
e740: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
e750: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
e760: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
e770: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
e780: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
e790: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
e7a0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
e7b0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
e7c0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
e7d0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e7e0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
e7f0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
e800: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
e810: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
e820: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e830: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
e840: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
e850: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
e860: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
e870: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
e880: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
e890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e8a0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
e8b0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
e8c0: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
e8d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
e8e0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
e8f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e900: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
e910: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
e920: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
e930: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
e940: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
e950: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
e960: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
e970: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
e980: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
e990: 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e  ACE */../* An in
e9a0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
e9b0: 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
e9c0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  bulk memory avai
e9d0: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  lable for use.**
e9e0: 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74   by subcomponent
e9f0: 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  s of a prepared 
ea00: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63  statement.  Spac
ea10: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  e is allocated o
ea20: 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61  ut.** of a Reusa
ea30: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20  bleSpace object 
ea40: 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63  by the allocSpac
ea50: 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f  e() routine belo
ea60: 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75  w..*/.struct Reu
ea70: 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75  sableSpace {.  u
ea80: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
ea90: 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65      /* Available
eaa0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
eab0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
eac0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76    /* Bytes of av
ead0: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a  ailable memory *
eae0: 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b  /.  int nNeeded;
eaf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
eb00: 6c 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75  l bytes that cou
eb10: 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61  ld not be alloca
eb20: 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72  ted */.};../* Tr
eb30: 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42  y to allocate nB
eb40: 79 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62  yte bytes of 8-b
eb50: 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b  yte aligned bulk
eb60: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66   memory for pBuf
eb70: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75  .** from the Reu
eb80: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
eb90: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
eba0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
ebb0: 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20  cated.** memory 
ebc0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
ebd0: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d  insufficient mem
ebe0: 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ory is available
ebf0: 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61   in the.** Reusa
ec00: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c  bleSpace object,
ec10: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65   increase the Re
ec20: 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65  usableSpace.nNee
ec30: 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20  ded.** value by 
ec40: 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65  the amount neede
ec50: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
ec60: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66  L..**.** If pBuf
ec70: 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c   is not initiall
ec80: 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61  y NULL, that mea
ec90: 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ns that the memo
eca0: 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  ry has already.*
ecb0: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
ecc0: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
ecd0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
ece0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
ecf0: 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42   a copy.** of pB
ed00: 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75  uf and leave Reu
ed10: 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61  sableSpace uncha
ed20: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nged..**.** This
ed30: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d   allocator is em
ed40: 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70  ployed to repurp
ed50: 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73  ose unused slots
ed60: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ed70: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72  he.** opcode arr
ed80: 61 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  ay of prepared s
ed90: 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d  tate for other m
eda0: 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74  emory needs of t
edb0: 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  he prepared.** s
edc0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
edd0: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
ede0: 70 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52  pace(.  struct R
edf0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c  eusableSpace *p,
ee00: 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79    /* Bulk memory
ee10: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
ee20: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76  llocation */.  v
ee30: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
ee40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
ee50: 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61  ter to a prior a
ee60: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  llocation */.  i
ee70: 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
ee80: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
ee90: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64  s of memory need
eea0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
eeb0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
eec0: 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63  IGNMENT(p->pSpac
eed0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  e) );.  if( pBuf
eee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ==0 ){.    nByte
eef0: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
ef00: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
ef10: 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  <= p->nFree ){. 
ef20: 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d       p->nFree -=
ef30: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42   nByte;.      pB
ef40: 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b  uf = &p->pSpace[
ef50: 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d  p->nFree];.    }
ef60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
ef70: 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b  Needed += nByte;
ef80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
ef90: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
efa0: 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20  ALIGNMENT(pBuf) 
efb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66  );.  return pBuf
efc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e  ;.}../*.** Rewin
efd0: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20  d the VDBE back 
efe0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
eff0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
f000: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  for.** running i
f010: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
f020: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62  e3VdbeRewind(Vdb
f030: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
f040: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
f050: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
f060: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
f070: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  i;.#endif.  asse
f080: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
f090: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
f0a0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
f0b0: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
f0c0: 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b  E_MAGIC_RESET );
f0d0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
f0e0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
f0f0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
f100: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
f110: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
f120: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
f130: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
f140: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
f150: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
f160: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
f170: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
f180: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
f190: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=0; i<p->nMem
f1a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
f1b0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
f1c0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
f1d0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
f1e0: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
f1f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
f200: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
f210: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61  Abort;.  p->nCha
f220: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
f230: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
f240: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
f250: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
f260: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
f270: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
f280: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
f290: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f  DBE_PROFILE.  fo
f2a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
f2b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f   i++){.    p->aO
f2c0: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
f2d0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
f2e0: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  es = 0;.  }.#end
f2f0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
f300: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
f310: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
f320: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73  ion for the firs
f330: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20  t time after.** 
f340: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72  creating the vir
f350: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
f360: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
f370: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
f380: 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74  llocating regist
f390: 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ers and initiali
f3a0: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
f3b0: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
f3c0: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
f3d0: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
f3e0: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
f3f0: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
f400: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
f410: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
f420: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
f430: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
f440: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e   exactly once on
f450: 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61   each virtual ma
f460: 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20  chine..** After 
f470: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f480: 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61  called the VM ha
f490: 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64  s been "packaged
f4a0: 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a  " and is ready.*
f4b0: 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72  * to run.  After
f4c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f4d0: 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72   called, further
f4e0: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71   calls to .** sq
f4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29  lite3VdbeAddOp()
f500: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70   functions are p
f510: 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73  rohibited.  This
f520: 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e   routine disconn
f530: 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65  ects.** the Vdbe
f540: 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20   from the Parse 
f550: 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70  object that help
f560: 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73  ed generate it s
f570: 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68  o that the.** th
f580: 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61  e Vdbe becomes a
f590: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e  n independent en
f5a0: 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72  tity and the Par
f5b0: 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65  se object can be
f5c0: 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  .** destroyed..*
f5d0: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
f5e0: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29  ite3VdbeRewind()
f5f0: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65   procedure to re
f600: 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20  store a virtual 
f610: 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20  machine back.** 
f620: 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73  to its initial s
f630: 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61  tate after it ha
f640: 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76  s been run..*/.v
f650: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
f660: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
f670: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
f680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f690: 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73  e VDBE */.  Pars
f6a0: 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20  e *pParse       
f6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f6c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f6d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
f6e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
f6f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
f700: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
f710: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20  */.  int nVar;  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f740: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
f750: 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20   int nMem;      
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20  /* Number of VM 
f780: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
f790: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
f7a0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
f7b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f7c0: 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72  f cursors requir
f7d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ed */.  int nArg
f7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f7f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f800: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e   of arguments in
f810: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
f820: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
f850: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75   */.  struct Reu
f860: 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20  sableSpace x;   
f870: 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65       /* Reusable
f880: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a   bulk memory */.
f890: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
f8a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f8b0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
f8c0: 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
f8d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
f8e0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
f8f0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
f900: 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72   pParse==p->pPar
f910: 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  se );.  db = p->
f920: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
f930: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
f940: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
f950: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
f960: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
f970: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
f980: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
f990: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
f9a0: 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45  axArg;.  .  /* E
f9b0: 61 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20  ach cursor uses 
f9c0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20  a memory cell.  
f9d0: 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  The first cursor
f9e0: 20 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a   (cursor 0) can.
f9f0: 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d    ** use aMem[0]
fa00: 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74   which is not ot
fa10: 68 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20  herwise used by 
fa20: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
fa30: 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  .  Allocate.  **
fa40: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
fa50: 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20  d of aMem[] for 
fa60: 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72  cursors 1 and gr
fa70: 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20  eater..  ** See 
fa80: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
fa90: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
faa0: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
fab0: 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30    if( nCursor==0
fac0: 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65   && nMem>0 ) nMe
fad0: 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66  m++;  /* Space f
fae0: 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20  or aMem[0] even 
faf0: 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a  if not used */..
fb00: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
fb10: 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c  how much reusabl
fb20: 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69  e memory is avai
fb30: 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64  lable at the end
fb40: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63   of the.  ** opc
fb50: 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
fb60: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69   extra memory wi
fb70: 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ll be reallocate
fb80: 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d  d for other elem
fb90: 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
fba0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
fbb0: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  ent..  */.  n = 
fbc0: 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70  ROUND8(sizeof(Op
fbd0: 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20  )*p->nOp);      
fbe0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
fbf0: 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72   of opcode memor
fc00: 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53  y used */.  x.pS
fc10: 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d  pace = &((u8*)p-
fc20: 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20  >aOp)[n];       
fc30: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
fc40: 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  d opcode memory 
fc50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  */.  assert( EIG
fc60: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
fc70: 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20  T(x.pSpace) );. 
fc80: 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44   x.nFree = ROUND
fc90: 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a  DOWN8(pParse->sz
fca0: 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f  OpAlloc - n);  /
fcb0: 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65  * Bytes of unuse
fcc0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  d memory */.  as
fcd0: 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30  sert( x.nFree>=0
fce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
fcf0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
fd00: 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e  NT(&x.pSpace[x.n
fd10: 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73  Free]) );..  res
fd20: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
fd30: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
fd40: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
fd50: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
fd60: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
fd70: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
fd80: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
fd90: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
fda0: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
fdb0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72  ;.  }.  p->expir
fdc0: 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65  ed = 0;..  /* Me
fdd0: 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65  mory for registe
fde0: 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20  rs, parameters, 
fdf0: 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20  cursor, etc, is 
fe00: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65  allocated in one
fe10: 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   or two.  ** pas
fe20: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
fe30: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
fe40: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
fe50: 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20  memory at the . 
fe60: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
fe70: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
fe80: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
fe90: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
fea0: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
feb0: 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e  ements by reusin
fec0: 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  g the opcode arr
fed0: 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68  ay tail, then th
fee0: 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61  e second.  ** pa
fef0: 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20  ss will fill in 
ff00: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73  the remainder us
ff10: 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f  ing a fresh memo
ff20: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ry allocation.  
ff30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
ff40: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
ff50: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
ff60: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
ff70: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
ff80: 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20  ** the leftover 
ff90: 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e  memory at the en
ffa0: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
ffb0: 61 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e  array.  This can
ffc0: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
ffd0: 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61   ** reduce the a
ffe0: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
fff0: 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72  held by a prepar
10000 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
10010 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e  */.  do {.    x.
10020 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20  nNeeded = 0;.   
10030 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
10040 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65  Space(&x, p->aMe
10050 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d  m, nMem*sizeof(M
10060 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  em));.    p->aVa
10070 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
10080 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  x, p->aVar, nVar
10090 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20  *sizeof(Mem));. 
100a0 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c     p->apArg = al
100b0 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
100c0 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
100d0 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70  of(Mem*));.    p
100e0 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
100f0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73  pace(&x, p->apCs
10100 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
10110 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10130 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10140 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45  TATUS.    p->anE
10150 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
10160 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20  (&x, p->anExec, 
10170 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
10180 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  4));.#endif.    
10190 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30  if( x.nNeeded==0
101a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e   ) break;.    x.
101b0 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65  pSpace = p->pFre
101c0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
101d0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e  locRawNN(db, x.n
101e0 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e  Needed);.    x.n
101f0 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64  Free = x.nNeeded
10200 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d  ;.  }while( !db-
10210 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10220 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20  ..  p->pVList = 
10230 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a  pParse->pVList;.
10240 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74    pParse->pVList
10250 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c   =  0;.  p->expl
10260 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
10270 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d  plain;.  if( db-
10280 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10290 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30  .    p->nVar = 0
102a0 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ;.    p->nCursor
102b0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65   = 0;.    p->nMe
102c0 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 0;.  }else{.
102d0 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
102e0 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d   nCursor;.    p-
102f0 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
10300 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d  Var;.    initMem
10310 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e  Array(p->aVar, n
10320 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  Var, db, MEM_Nul
10330 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  l);.    p->nMem 
10340 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74  = nMem;.    init
10350 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
10360 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f  , nMem, db, MEM_
10370 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20  Undefined);.    
10380 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c  memset(p->apCsr,
10390 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65   0, nCursor*size
103a0 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29  of(VdbeCursor*))
103b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
103c0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
103d0 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65  STATUS.    memse
103e0 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20  t(p->anExec, 0, 
103f0 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
10400 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  4));.#endif.  }.
10410 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77    sqlite3VdbeRew
10420 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ind(p);.}../*.**
10430 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
10440 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
10450 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
10460 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
10470 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
10480 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
10490 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
104a0 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
104b0 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
104c0 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
104d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
104e0 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78  ssert( pCx->pBtx
104f0 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72  ==0 || pCx->eCur
10500 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
10510 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28  REE );.  switch(
10520 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29   pCx->eCurType )
10530 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  {.    case CURTY
10540 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20  PE_SORTER: {.   
10550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
10560 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
10570 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65   pCx);.      bre
10580 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10590 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  se CURTYPE_BTREE
105a0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  : {.      if( pC
105b0 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29  x->isEphemeral )
105c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  {.        if( pC
105d0 78 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65  x->pBtx ) sqlite
105e0 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
105f0 3e 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20  >pBtx);.        
10600 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
10610 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
10620 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
10630 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
10640 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  y.        ** the
10650 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
10660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10670 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78       assert( pCx
10680 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
10690 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
106a0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
106b0 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  or(pCx->uc.pCurs
106c0 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
106d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
106e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
106f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10700 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
10710 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  E_VTAB: {.      
10720 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
10730 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78  sor *pVCur = pCx
10740 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20  ->uc.pVCur;.    
10750 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
10760 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
10770 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e  = pVCur->pVtab->
10780 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61  pModule;.      a
10790 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56  ssert( pVCur->pV
107a0 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  tab->nRef>0 );. 
107b0 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61       pVCur->pVta
107c0 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  b->nRef--;.     
107d0 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
107e0 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62  (pVCur);.      b
107f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
10800 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
10810 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
10820 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
10830 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
10840 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73  c void closeCurs
10850 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20  orsInFrame(Vdbe 
10860 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
10870 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
10880 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
10890 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
108a0 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
108b0 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
108c0 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
108d0 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
108e0 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
108f0 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
10900 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
10910 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
10920 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10930 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
10940 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
10950 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
10960 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
10970 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
10980 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
10990 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
109a0 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
109b0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
109c0 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
109d0 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
109e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
109f0 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
10a00 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
10a10 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
10a20 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43  ame->v;.  closeC
10a30 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29  ursorsInFrame(v)
10a40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
10a50 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
10a60 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
10a70 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
10a80 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
10a90 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
10aa0 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
10ab0 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
10ac0 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
10ad0 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
10ae0 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
10af0 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
10b00 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
10b10 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
10b20 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
10b30 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
10b40 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
10b50 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
10b60 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
10b70 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68  ge;.  v->db->nCh
10b80 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
10b90 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69  DbChange;.  sqli
10ba0 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
10bb0 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e  Data(v->db, &v->
10bc0 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
10bd0 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20  ;.  v->pAuxData 
10be0 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61  = pFrame->pAuxDa
10bf0 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41  ta;.  pFrame->pA
10c00 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65  uxData = 0;.  re
10c10 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
10c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10c30 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
10c40 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
10c50 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
10c60 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
10c70 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
10c80 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
10c90 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
10ca0 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
10cb0 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
10cc0 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
10cd0 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
10ce0 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
10cf0 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
10d00 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
10d10 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
10d20 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
10d30 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
10d40 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
10d50 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
10d60 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
10d70 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
10d80 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
10d90 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
10da0 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
10db0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
10dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10dd0 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
10de0 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72  ame);.    p->pFr
10df0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ame = 0;.    p->
10e00 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  nFrame = 0;.  }.
10e10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
10e20 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73  ame==0 );.  clos
10e30 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
10e40 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  p);.  if( p->aMe
10e50 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
10e60 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
10e70 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
10e80 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
10e90 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
10ea0 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
10eb0 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
10ec0 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
10ed0 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
10ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
10ef0 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
10f00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
10f10 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c  e any auxdata al
10f20 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
10f30 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66  y the VM */.  if
10f40 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20  ( p->pAuxData ) 
10f50 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
10f60 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20  eAuxData(p->db, 
10f70 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &p->pAuxData, -1
10f80 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
10f90 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  p->pAuxData==0 )
10fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
10fb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
10fc0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
10fd0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
10fe0 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
10ff0 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
11000 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
11010 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
11020 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
11030 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
11040 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
11050 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
11060 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
11070 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
11080 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
11090 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
110a0 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
110b0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
110c0 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
110d0 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
110e0 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  n){.  int n;.  s
110f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
11100 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52  db;..  if( p->nR
11110 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  esColumn ){.    
11120 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
11130 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
11140 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
11150 4d 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74  ME_N);.    sqlit
11160 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
11170 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  aColName);.  }. 
11180 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
11190 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
111a0 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
111b0 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
111c0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d  p->aColName = (M
111d0 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
111e0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
111f0 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
11200 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
11210 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
11220 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  nitMemArray(p->a
11230 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20  ColName, n, db, 
11240 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  MEM_Null);.}../*
11250 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
11260 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
11270 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
11280 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
11290 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
112a0 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
112b0 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
112c0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
112d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
112e0 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
112f0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
11300 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
11310 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
11320 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
11330 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
11340 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
11350 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
11360 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
11370 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
11380 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
11390 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
113a0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
113b0 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
113c0 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
113d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
113e0 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
113f0 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
11400 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
11410 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
11420 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
11440 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
11450 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
11460 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
11470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11480 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
11490 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
114a0 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
114d0 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
114e0 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
114f0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11510 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
11520 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
11530 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
11540 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
11550 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
11560 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
11570 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
11580 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
11590 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
115a0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
115b0 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
115c0 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
115d0 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
115e0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
115f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
11600 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
11610 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
11620 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
11630 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
11640 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
11650 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
11660 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
11670 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
11680 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
11690 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
116a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
116b0 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
116c0 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
116d0 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
116e0 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
116f0 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
11700 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
11710 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
11720 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11730 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
11740 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
11750 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
11760 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
11770 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
11780 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
11790 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
117a0 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
117b0 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
117c0 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
117d0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
117e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
117f0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
11800 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
11810 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11820 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
11830 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
11840 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
11850 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
11860 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
11870 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
11880 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
11890 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
118a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te-transaction. 
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61    ** that are ca
118d0 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74  ndidates for a t
118e0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20  wo-phase commit 
118f0 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20  using a.        
11900 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61             ** ma
11910 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster-journal */.
11920 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11930 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
11940 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
11950 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
11960 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11970 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
11980 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
11990 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
119a0 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
119b0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
119c0 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
119d0 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
119e0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
119f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
11a00 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
11a10 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
11a20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
11a30 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
11a40 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
11a50 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
11a60 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
11a70 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
11a80 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
11a90 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
11aa0 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
11ab0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
11ac0 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
11ad0 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
11ae0 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
11af0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
11b00 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
11b10 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
11b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
11b30 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a  abSync(db, p);..
11b40 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
11b50 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
11b60 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
11b70 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
11b80 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
11b90 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
11ba0 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
11bb0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
11bc0 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
11bd0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
11be0 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
11bf0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
11c00 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
11c10 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
11c20 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
11c30 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
11c40 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
11c50 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
11c60 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
11c70 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
11c80 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
11c90 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
11ca0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
11cb0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
11cc0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11cd0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11ce0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
11cf0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
11d00 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  {.      /* Wheth
11d10 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61  er or not a data
11d20 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20  base might need 
11d30 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11d40 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20   depends upon.  
11d50 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e      ** its journ
11d60 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f  al mode (among o
11d70 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54  ther things).  T
11d80 68 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72  his matrix deter
11d90 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20  mines which.    
11da0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64    ** journal mod
11db0 65 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20  es use a master 
11dc0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63  journal and whic
11dd0 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20  h do not */.    
11de0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
11df0 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20  8 aMJNeeded[] = 
11e00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c  {.        /* DEL
11e10 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20  ETE   */  1,.   
11e20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20       /* PERSIST 
11e30 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20    */ 1,.        
11e40 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20  /* OFF       */ 
11e50 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52  0,.        /* TR
11e60 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20  UNCATE  */ 1,.  
11e70 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20        /* MEMORY 
11e80 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20     */ 0,.       
11e90 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f   /* WAL       */
11ea0 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
11eb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
11ec0 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f     /* Pager asso
11ed0 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20  ciated with pBt 
11ee0 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  */.      needXco
11ef0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
11f00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11f10 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50  r(pBt);.      pP
11f20 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
11f30 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20  reePager(pBt);. 
11f40 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62       if( db->aDb
11f50 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [i].safety_level
11f60 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  !=PAGER_SYNCHRON
11f70 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26  OUS_OFF.       &
11f80 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69  & aMJNeeded[sqli
11f90 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e  te3PagerGetJourn
11fa0 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a  alMode(pPager)].
11fb0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
11fc0 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50  3PagerIsMemdb(pP
11fd0 61 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29  ager)==0.      )
11fe0 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  { .        asser
11ff0 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20  t( i!=1 );.     
12000 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20     nTrans++;.   
12010 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
12020 73 71 6c 69 74 65 33 42 74 72 65 65 45 78 63 6c  sqlite3BtreeExcl
12030 75 73 69 76 65 4c 6f 63 6b 28 70 42 74 29 3b 0a  usiveLock(pBt);.
12040 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12050 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20  eeLeave(pBt);.  
12060 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66    }.  }..#ifndef
12070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
12080 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 64 62  CURRENT.  if( db
12090 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26  ->bConcurrent &&
120a0 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d 53 51   (rc & 0xFF)==SQ
120b0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
120c0 20 2f 2a 20 41 6e 20 53 51 4c 49 54 45 5f 42 55   /* An SQLITE_BU
120d0 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 42 55 53  SY or SQLITE_BUS
120e0 59 5f 53 4e 41 50 53 48 4f 54 20 77 61 73 20 65  Y_SNAPSHOT was e
120f0 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
12100 20 0a 20 20 20 20 2a 2a 20 61 74 74 65 6d 70 74   .    ** attempt
12110 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ing to take the 
12120 57 52 49 54 45 52 20 6c 6f 63 6b 20 6f 6e 20 61  WRITER lock on a
12130 20 77 61 6c 20 66 69 6c 65 2e 20 52 65 6c 65 61   wal file. Relea
12140 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 52  se the.    ** WR
12150 49 54 45 52 20 6c 6f 63 6b 73 20 6f 6e 20 61 6c  ITER locks on al
12160 6c 20 77 61 6c 20 66 69 6c 65 73 20 61 6e 64 20  l wal files and 
12170 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a  return early.  *
12180 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
12190 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
121a0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
121b0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
121c0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
121d0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
121e0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
121f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
12200 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  nter(pBt);.     
12210 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
12220 72 6f 70 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  ropExclusiveLock
12230 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
12240 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
12250 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12260 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ave(pBt);.      
12270 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
12280 69 66 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  if..  if( rc!=SQ
12290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
122a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
122b0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
122c0 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
122d0 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
122e0 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
122f0 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
12300 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
12310 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
12320 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
12330 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
12340 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
12350 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
12360 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
12370 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12380 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
12390 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
123a0 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
123b0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
123c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
123d0 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
123e0 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
123f0 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
12400 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
12410 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
12420 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
12430 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
12440 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
12450 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
12460 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
12470 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
12480 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
12490 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
124a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
124b0 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
124c0 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
124d0 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
124e0 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
124f0 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
12500 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
12510 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
12520 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
12530 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
12540 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
12550 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
12560 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
12570 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
12580 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
12590 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
125a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
125b0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
125c0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
125d0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
125e0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
125f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
12600 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
12610 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
12620 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12630 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
12640 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
12650 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
12660 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
12670 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
12680 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
12690 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
126a0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
126b0 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
126c0 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
126d0 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
126e0 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
126f0 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
12700 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
12710 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
12720 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
12730 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
12740 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
12750 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
12760 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
12770 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
12780 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
12790 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
127a0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
127b0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
127c0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
127d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
127e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
127f0 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
12800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12810 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12830 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
12840 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
12850 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
12860 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
12870 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
12880 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
12890 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
128a0 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
128b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
128c0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
128d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
128e0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
128f0 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
12900 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12910 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
12920 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
12930 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
12940 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  s;.    char *zMa
12950 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
12960 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
12970 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12980 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
12990 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
129a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
129b0 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
129c0 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
129d0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
129e0 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
129f0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
12a00 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
12a10 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a  retryCount = 0;.
12a20 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c      int nMainFil
12a30 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  e;..    /* Selec
12a40 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
12a50 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
12a60 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20      nMainFile = 
12a70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12a80 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
12a90 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
12aa0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
12ab0 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20  -mjXXXXXX9XXz", 
12ac0 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
12ad0 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29  if( zMaster==0 )
12ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12af0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64  OMEM_BKPT;.    d
12b00 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
12b10 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
12b20 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
12b30 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
12b40 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
12b50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
12b60 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
12b70 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
12b80 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
12b90 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
12ba0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12bb0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
12bc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12bd0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
12be0 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
12bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
12c00 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
12c10 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
12c20 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
12c30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12c40 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
12c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
12c60 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
12c70 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
12c80 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
12c90 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
12ca0 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
12cb0 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
12cc0 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
12cf0 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
12d00 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
12d10 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
12d20 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
12d30 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
12d40 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
12d50 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
12d60 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
12d70 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
12d80 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
12d90 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
12da0 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
12db0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
12dc0 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
12dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
12de0 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
12df0 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
12e00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12e10 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
12e20 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
12e30 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
12e40 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
12e50 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
12e60 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
12e70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12e80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
12e90 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
12ea0 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
12eb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
12ec0 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
12ed0 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
12ee0 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
12ef0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
12f00 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
12f10 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
12f20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
12f30 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
12f40 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
12f50 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
12f60 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
12f70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12f90 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12fa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12fb0 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
12fc0 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
12fd0 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
12fe0 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
12ff0 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
13000 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
13010 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
13020 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13030 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
13040 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
13050 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
13060 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
13070 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
13080 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
13090 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
130a0 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
130b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
130c0 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
130d0 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
130e0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
130f0 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
13100 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
13110 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
13120 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
13130 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
13140 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
13150 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
13160 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
13170 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
13180 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
13190 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
131a0 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
131b0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
131c0 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
131d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
131e0 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
131f0 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
13200 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
13210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13220 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
13230 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
13240 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
13250 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
13260 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
13270 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
13280 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
13290 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
132a0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
132b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
132c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
132d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
132e0 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
132f0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
13300 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13310 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
13320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13330 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
13340 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
13350 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13370 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
13380 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
13390 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
133a0 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
133b0 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
133c0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
133d0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
133e0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
133f0 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  f( 0==(sqlite3Os
13400 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
13410 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
13420 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
13430 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
13440 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
13450 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
13460 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
13470 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
13480 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13490 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
134a0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
134b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
134c0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
134d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
134e0 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
134f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
13500 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
13510 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
13520 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
13530 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
13540 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
13550 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
13560 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13570 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
13580 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
13590 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
135a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
135b0 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
135c0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
135d0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
135e0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
135f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13600 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
13610 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
13620 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13630 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
13640 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
13650 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
13660 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
13670 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
13680 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
13690 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
136a0 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
136b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
136c0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
136d0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
136e0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
136f0 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
13700 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
13710 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
13720 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
13730 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
13740 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
13750 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
13760 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
13770 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
13780 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13790 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
137a0 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
137b0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
137c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
137d0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
137e0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
137f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
13800 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
13810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13820 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13830 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
13840 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13850 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
13860 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
13870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
13880 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
13890 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
138a0 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
138b0 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
138c0 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
138d0 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
138e0 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
138f0 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
13900 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
13910 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
13920 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
13930 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
13940 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
13950 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
13960 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
13970 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
13980 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
139a0 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
139b0 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
139c0 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
139d0 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
139e0 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
139f0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
13a00 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
13a10 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
13a20 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
13a30 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
13a40 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
13a50 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
13a60 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
13a70 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
13a80 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
13a90 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
13aa0 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
13ab0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
13ac0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
13ad0 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
13ae0 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
13af0 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
13b00 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
13b10 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
13b20 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
13b30 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
13b40 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
13b50 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
13b60 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
13b70 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
13b80 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
13b90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13ba0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
13bb0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
13bc0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
13bd0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
13be0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13bf0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
13c00 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
13c10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13c20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
13c30 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
13c40 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
13c50 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
13c60 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
13c70 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
13c80 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
13c90 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
13ca0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
13cb0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
13cc0 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
13cd0 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
13ce0 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
13cf0 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
13d00 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
13d10 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
13d20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
13d30 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
13d40 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
13d50 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
13d60 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
13d70 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
13d80 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
13d90 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
13da0 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
13db0 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
13dc0 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
13dd0 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
13de0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
13df0 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
13e00 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
13e10 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
13e20 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
13e30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
13e40 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
13e50 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
13e60 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
13e70 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
13e80 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
13e90 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
13ea0 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
13eb0 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
13ec0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
13ed0 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
13ee0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
13ef0 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
13f00 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
13f10 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
13f20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
13f30 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
13f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
13f50 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
13f60 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
13f70 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
13f80 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
13f90 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
13fa0 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
13fb0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
13fc0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
13fd0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
13fe0 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
13ff0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
14000 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
14010 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
14020 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
14030 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
14040 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
14050 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
14060 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
14070 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
14080 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
14090 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
140a0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
140b0 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
140c0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
140d0 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
140e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
140f0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
14100 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
14110 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
14120 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
14130 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
14140 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
14150 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
14160 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
14170 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62  NOINLINE int vdb
14180 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14190 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
141a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
141b0 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
141c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
141d0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
141e0 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
141f0 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
14200 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65  ement-1;..  asse
14210 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
14220 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
14230 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
14240 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74  LEASE);.  assert
14250 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
14260 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
14270 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
14280 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
14290 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
142a0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
142b0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
142c0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
142d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72  LITE_OK;.    Btr
142e0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
142f0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
14300 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69  ( pBt ){.      i
14310 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
14320 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
14330 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
14340 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
14350 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
14360 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
14370 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
14380 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
14390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
143a0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
143b0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
143c0 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
143d0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
143e0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
143f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14410 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
14420 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  }.    }.  }.  db
14430 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
14440 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
14450 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  = 0;..  if( rc==
14460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14470 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
14480 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
14490 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
144a0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
144b0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
144c0 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
144d0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
144e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
144f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
14500 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
14510 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
14520 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
14530 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
14540 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  }..  /* If the s
14550 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
14560 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
14570 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
14580 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a  restore the .  *
14590 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
145a0 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
145b0 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
145c0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
145d0 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68  ad when .  ** th
145e0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
145f0 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
14600 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f  ed.  */.  if( eO
14610 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
14620 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d  LBACK ){.    db-
14630 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
14640 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
14650 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  ;.    db->nDefer
14660 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
14670 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
14680 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14690 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
146a0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
146b0 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
146c0 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  Op){.  if( p->db
146d0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
146e0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
146f0 0a 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65  .    return vdbe
14700 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
14710 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  , eOp);.  }.  re
14720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14730 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
14740 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14750 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
14760 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
14770 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
14780 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
14790 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
147a0 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
147b0 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
147c0 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
147d0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
147e0 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
147f0 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
14800 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
14810 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
14820 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
14830 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
14840 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
14850 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
14860 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
14870 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
14880 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
14890 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
148a0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
148b0 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
148c0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
148d0 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
148e0 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
148f0 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
14900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14910 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
14920 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
14930 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
14940 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
14950 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
14960 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
14970 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
14980 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
14990 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
149a0 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
149b0 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
149c0 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
149d0 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
149e0 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
149f0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
14a00 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
14a10 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
14a20 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
14a30 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
14a40 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46  3VdbeError(p, "F
14a50 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
14a60 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
14a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14a80 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
14a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14aa0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14ab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14ac0 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
14ad0 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
14ae0 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
14af0 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
14b00 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
14b10 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
14b20 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
14b30 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
14b40 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
14b50 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
14b60 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
14b70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14b80 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
14b90 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
14ba0 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
14bb0 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
14bc0 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
14bd0 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
14be0 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
14bf0 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
14c00 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
14c10 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
14c20 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
14c30 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
14c40 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
14c50 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
14c60 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
14c70 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
14c80 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
14c90 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
14ca0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
14cb0 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
14cc0 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
14cd0 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
14ce0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
14cf0 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
14d00 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
14d10 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
14d20 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14d40 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
14d50 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
14d60 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
14d70 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
14d80 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
14d90 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
14da0 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
14db0 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
14dc0 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
14dd0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
14de0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
14df0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
14e00 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
14e10 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
14e20 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
14e30 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
14e40 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
14e50 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
14e60 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
14e70 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
14e80 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
14e90 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
14ea0 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
14eb0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
14ec0 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
14ed0 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
14ee0 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
14ef0 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
14f00 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
14f10 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
14f20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
14f30 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
14f40 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
14f50 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
14f60 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
14f70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
14f80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
14f90 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14fa0 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
14fb0 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
14fc0 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
14fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14fe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
14ff0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15000 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
15010 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15020 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
15030 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b  sors(p);.  check
15040 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
15050 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
15060 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
15070 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
15080 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
15090 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
150a0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
150b0 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
150c0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
150d0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
150e0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
150f0 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
15100 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
15110 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
15120 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
15130 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
15140 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
15150 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
15160 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
15170 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
15180 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
15190 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
151a0 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
151b0 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
151c0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
151d0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
151e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
151f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
15200 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
15210 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
15220 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
15230 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
15240 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
15250 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
15260 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
15270 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
15280 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
15290 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
152a0 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
152b0 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
152c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
152d0 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
152e0 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
152f0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
15300 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
15310 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
15320 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
15330 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
15340 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
15350 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
15360 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
15370 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
15380 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
15390 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
153a0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
153b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
153c0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
153d0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
153e0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
153f0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
15400 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
15410 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
15420 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
15430 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
15440 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
15450 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
15460 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
15470 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
15480 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
15490 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
154a0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
154b0 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
154c0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
154d0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
154e0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
154f0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
15500 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
15510 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
15520 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
15530 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
15540 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
15550 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
15560 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
15570 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
15580 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
15590 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
155a0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
155b0 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
155c0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
155d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
155e0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
155f0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
15600 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15610 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
15620 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
15630 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
15640 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
15650 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
15660 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
15670 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
15680 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
15690 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
156a0 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
156b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
156c0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
156d0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
156e0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
156f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15700 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15710 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15720 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
15730 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
15740 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
15750 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
15760 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
15770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15780 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
15790 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
157a0 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
157b0 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
157c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
157d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
157e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
157f0 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
15800 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
15810 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
15820 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
15830 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
15840 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
15850 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
15860 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
15870 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
15880 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
15890 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
158a0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
158b0 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
158c0 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
158d0 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
158e0 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
158f0 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
15900 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
15910 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
15920 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
15930 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
15940 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
15950 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
15960 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
15970 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
15980 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15990 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
159a0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
159b0 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
159c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
159d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
159e0 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
159f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15a10 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
15a20 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
15a30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15a40 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
15a50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15a60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15a70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15a80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15a90 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
15aa0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
15ab0 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
15ac0 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
15ad0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
15ae0 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
15af0 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
15b00 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
15b10 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
15b20 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
15b30 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
15b40 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
15b50 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
15b60 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
15b70 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
15b80 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
15b90 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
15ba0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
15bb0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
15bc0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
15bd0 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
15be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15bf0 20 69 66 28 20 28 72 63 20 26 20 30 78 46 46 29   if( (rc & 0xFF)
15c00 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
15c10 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
15c20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15c30 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
15c40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15c50 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rc;.        }els
15c60 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
15c70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15c80 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
15c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
15ca0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
15cb0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
15cc0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
15cd0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
15ce0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
15cf0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
15d00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
15d10 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
15d20 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
15d30 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
15d40 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
15d50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15d60 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
15d70 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
15d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
15d90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
15da0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
15db0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
15dc0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
15dd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
15de0 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
15df0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
15e00 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
15e10 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
15e20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
15e30 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
15e40 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
15e50 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
15e60 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
15e70 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
15e80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
15e90 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
15ea0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
15eb0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
15ec0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
15ed0 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
15ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15ef0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
15f00 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
15f10 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
15f20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
15f30 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
15f40 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
15f50 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
15f60 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
15f70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
15f80 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
15f90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
15fa0 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
15fb0 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
15fc0 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
15fd0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
15fe0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
15ff0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
16000 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
16010 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
16020 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
16030 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
16040 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
16050 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
16060 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
16070 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
16080 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
16090 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
160a0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
160b0 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
160c0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
160d0 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
160e0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
160f0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
16100 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
16110 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
16120 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
16130 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
16140 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16150 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16160 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
16170 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
16180 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
16190 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
161a0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
161b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
161c0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
161d0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
161e0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
161f0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
16200 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
16210 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
16220 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
16230 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
16240 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
16250 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
16260 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
16270 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e    db->bConcurren
16280 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
16290 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
162a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
162b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
162c0 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
162d0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61  DATE or DELETE a
162e0 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  nd no statement 
162f0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
16300 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c  ** has been roll
16310 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20  ed back, update 
16320 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
16330 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63  nection change-c
16340 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a  ounter. .    */.
16350 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67      if( p->chang
16360 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20  eCntOn ){.      
16370 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
16380 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  !=SAVEPOINT_ROLL
16390 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
163a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
163b0 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
163c0 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
163d0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
163e0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
163f0 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
16400 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
16410 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ge = 0;.    }.. 
16420 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
16430 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
16440 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
16450 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  p);.  }..  /* We
16460 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
16470 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
16480 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
16490 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
164a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
164b0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64  0 ){.    db->nVd
164c0 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20  beActive--;.    
164d0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
164e0 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74   ) db->nVdbeWrit
164f0 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e--;.    if( p->
16500 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e  bIsReader ) db->
16510 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20  nVdbeRead--;.   
16520 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
16530 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56  beActive>=db->nV
16540 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61  dbeRead );.    a
16550 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
16560 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57  Read>=db->nVdbeW
16570 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65  rite );.    asse
16580 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  rt( db->nVdbeWri
16590 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  te>=0 );.  }.  p
165a0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
165b0 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
165c0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
165d0 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  db);.  if( db->m
165e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
165f0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
16600 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
16610 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
16620 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
16630 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
16640 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74  then any locks t
16650 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20  hat were held.  
16660 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** by connection
16670 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65   db have now bee
16680 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c  n released. Call
16690 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
166a0 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20  onUnlocked() .  
166b0 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79  ** to invoke any
166c0 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b   required unlock
166d0 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
166e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
166f0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
16700 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
16710 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62  ctionUnlocked(db
16720 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
16730 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
16740 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43  e>0 || db->autoC
16750 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ommit==0 || db->
16760 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b  nStatement==0 );
16770 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
16780 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20  ==SQLITE_BUSY ? 
16790 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51  SQLITE_BUSY : SQ
167a0 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a  LITE_OK);.}.../*
167b0 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
167c0 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
167d0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
167e0 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
167f0 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
16800 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
16810 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
16820 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
16830 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
16840 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
16850 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
16860 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
16870 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16880 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63  Copy the error c
16890 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
168a0 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  ssage belonging 
168b0 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73  to the VDBE pass
168c0 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
168d0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69  st argument to i
168e0 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ts database hand
168f0 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79  le (so that they
16900 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74   will be .** ret
16910 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74  urned by calls t
16920 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  o sqlite3_errcod
16930 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  e() and sqlite3_
16940 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a  errmsg())..**.**
16950 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
16960 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68  oes not clear th
16970 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64  e VDBE error cod
16980 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75  e or message, ju
16990 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65  st.** copies the
169a0 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  m to the databas
169b0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
169c0 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
169d0 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a  sferError(Vdbe *
169e0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
169f0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
16a00 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69   rc = p->rc;.  i
16a10 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  f( p->zErrMsg ){
16a20 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
16a30 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71  Malloc++;.    sq
16a40 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
16a50 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
16a60 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
16a70 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
16a80 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
16a90 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
16aa0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
16ab0 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
16ac0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
16ad0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
16ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
16af0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
16b00 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61     db->bBenignMa
16b10 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20  lloc--;.  }else 
16b20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a  if( db->pErr ){.
16b30 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
16b40 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72  SetNull(db->pErr
16b50 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72  );.  }.  db->err
16b60 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 65 74  Code = rc;.  ret
16b70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
16b80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16b90 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20  SQLLOG./*.** If 
16ba0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  an SQLITE_CONFIG
16bb0 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20  _SQLLOG hook is 
16bc0 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74  registered and t
16bd0 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72  he VM has been r
16be0 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69  un, .** invoke i
16bf0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
16c00 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  d vdbeInvokeSqll
16c10 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69  og(Vdbe *v){.  i
16c20 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
16c30 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26  Config.xSqllog &
16c40 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & v->rc==SQLITE_
16c50 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26  OK && v->zSql &&
16c60 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   v->pc>=0 ){.   
16c70 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64   char *zExpanded
16c80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
16c90 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53  pandSql(v, v->zS
16ca0 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ql);.    assert(
16cb0 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73   v->db->init.bus
16cc0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
16cd0 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20  zExpanded ){.   
16ce0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
16cf0 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a  Config.xSqllog(.
16d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16d10 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
16d20 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c  qllogArg, v->db,
16d30 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20   zExpanded, 1.  
16d40 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
16d50 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
16d60 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20  , zExpanded);.  
16d70 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
16d80 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76  # define vdbeInv
16d90 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e  okeSqllog(x).#en
16da0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  dif../*.** Clean
16db0 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
16dc0 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
16dd0 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
16de0 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
16df0 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
16e00 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
16e10 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
16e20 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
16e30 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
16e40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16e50 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
16e60 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
16e70 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
16e80 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
16e90 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
16ea0 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
16eb0 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
16ec0 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
16ed0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
16ee0 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
16ef0 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
16f00 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
16f10 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
16f20 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
16f30 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
16f40 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
16f50 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
16f60 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
16f70 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
16f80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
16f90 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
16fa0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
16fb0 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
16fc0 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
16fd0 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
16fe0 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
16ff0 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
17000 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
17010 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
17020 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
17030 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
17040 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
17050 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
17060 56 44 42 45 20 68 61 73 20 62 65 65 6e 20 72 75  VDBE has been ru
17070 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
17080 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
17090 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
170a0 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
170b0 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
170c0 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
170d0 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
170e0 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
170f0 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
17100 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
17110 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
17120 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
17130 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
17140 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
17150 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
17160 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
17170 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
17180 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
17190 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
171a0 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
171b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
171c0 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
171d0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  p);.    if( p->r
171e0 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
171f0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
17200 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
17210 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
17220 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
17230 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
17240 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
17250 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
17260 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
17270 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
17280 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
17290 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
172a0 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
172b0 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
172c0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
172d0 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
172e0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
172f0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
17300 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
17310 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
17320 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
17330 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74  .  }..  /* Reset
17340 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
17350 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65  ts and reclaim e
17360 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d  rror message mem
17370 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ory..  */.#ifdef
17380 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
17390 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
173a0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
173b0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
173c0 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
173d0 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
173e0 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
173f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
17400 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
17410 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66  if( p->apCsr ) f
17420 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
17430 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  rsor; i++) asser
17440 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d  t( p->apCsr[i]==
17450 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  0 );.  if( p->aM
17460 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  em ){.    for(i=
17470 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  0; i<p->nMem; i+
17480 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
17490 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
174a0 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
174b0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
174c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
174d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
174e0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
174f0 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
17500 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17510 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74 65  EBUG.  p->nWrite
17520 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
17530 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
17540 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
17550 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
17560 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
17570 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
17580 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
17590 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
175a0 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
175b0 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
175c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
175d0 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
175e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
175f0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
17600 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
17610 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
17620 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
17630 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
17640 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
17650 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
17660 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
17670 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
17680 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
17690 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
176a0 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
176b0 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
176c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
176d0 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
176e0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
176f0 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
17700 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
17710 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
17720 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17730 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
17740 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
17750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
17760 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
17770 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
17780 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
17790 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
177a0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
177b0 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
177c0 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
177d0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
177e0 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
177f0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
17800 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
17810 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
17820 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
17830 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
17840 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
17850 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
17860 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
17870 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
17880 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
17890 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
178a0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
178b0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
178c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
178d0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
178e0 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20  E_MAGIC_RESET;. 
178f0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
17900 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
17910 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
17920 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
17930 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
17940 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
17950 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
17960 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
17970 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
17980 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
17990 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
179a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
179b0 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
179c0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
179d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
179e0 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
179f0 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
17a00 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
17a10 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
17a20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
17a30 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
17a40 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
17a50 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
17a60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
17a70 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
17a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17a90 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
17aa0 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
17ab0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
17ac0 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
17ad0 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
17ae0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
17af0 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
17b00 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
17b10 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
17b20 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
17b30 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
17b40 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
17b50 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
17b60 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
17b70 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
17b80 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
17b90 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
17ba0 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
17bb0 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
17bc0 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
17bd0 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
17be0 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
17bf0 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
17c00 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
17c10 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
17c20 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
17c30 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
17c40 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
17c50 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
17c60 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
17c70 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
17c80 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
17c90 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
17ca0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
17cb0 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
17cc0 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
17cd0 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
17ce0 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
17cf0 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73  parameter corres
17d00 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65  ponds to bit 0 e
17d10 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tc.)..*/.void sq
17d20 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
17d30 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a  uxData(sqlite3 *
17d40 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70  db, AuxData **pp
17d50 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
17d60 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a  ask){.  while( *
17d70 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74  pp ){.    AuxDat
17d80 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20  a *pAux = *pp;. 
17d90 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20     if( (iOp<0). 
17da0 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41      || (pAux->iA
17db0 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20  uxOp==iOp.      
17dc0 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75      && pAux->iAu
17dd0 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20  xArg>=0.        
17de0 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78    && (pAux->iAux
17df0 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b  Arg>31 || !(mask
17e00 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75   & MASKBIT32(pAu
17e10 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20  x->iAuxArg)))). 
17e20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
17e30 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78  case( pAux->iAux
17e40 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
17e50 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
17e60 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20  teAux ){.       
17e70 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75   pAux->xDeleteAu
17e80 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  x(pAux->pAux);. 
17e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
17ea0 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75   = pAux->pNextAu
17eb0 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  x;.      sqlite3
17ec0 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29  DbFree(db, pAux)
17ed0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17ee0 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
17ef0 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20  extAux;.    }.  
17f00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
17f10 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
17f20 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
17f30 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
17f40 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17f50 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72  t,.** except for
17f60 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20   object itself, 
17f70 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76  which is preserv
17f80 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ed..**.** The di
17f90 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
17fa0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
17fb0 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
17fc0 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a  lete() is that.*
17fd0 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61  * VdbeDelete() a
17fe0 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  lso unlinks the 
17ff0 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  Vdbe from the li
18000 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69  st of VMs associ
18010 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
18020 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
18030 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74  tion and frees t
18040 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  he object itself
18050 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18060 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
18070 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
18080 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
18090 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
180a0 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  xt;.  assert( p-
180b0 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
180c0 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
180d0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
180e0 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
180f0 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
18100 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
18110 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
18120 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
18130 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
18140 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
18150 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
18160 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
18170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
18180 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
18190 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67    }.  if( p->mag
181a0 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
181b0 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  NIT ){.    relea
181c0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
181d0 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
181e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
181f0 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a  db, p->pVList);.
18200 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18210 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
18220 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f  .  }.  vdbeFreeO
18230 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
18240 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
18250 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18260 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
18270 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18280 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64  , p->zSql);.#ifd
18290 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
182a0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
182b0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
182c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
182d0 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
182e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
182f0 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
18300 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
18310 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18320 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29  ee(db, p->aScan)
18330 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
18340 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
18350 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
18360 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18370 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
18380 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18390 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
183a0 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
183b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
183c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
183d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
183e0 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
183f0 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
18400 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
18410 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
18420 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
18430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18440 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
18450 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
18460 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
18470 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
18480 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
18490 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
184a0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
184b0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
184c0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
184d0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
184e0 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  eeNN(db, p);.}..
184f0 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
18500 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
18510 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
18520 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
18530 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
18540 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
18550 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
18560 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
18570 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
18580 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
18590 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
185a0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
185b0 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
185c0 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
185d0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
185e0 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
185f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18600 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
18610 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
18620 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
18630 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
18640 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
18650 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
18660 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
18670 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
18680 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  REE );.  rc = sq
18690 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
186a0 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70  Unpacked(p->uc.p
186b0 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
186c0 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
186d0 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
186e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
186f0 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
18700 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18710 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
18720 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
18730 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
18740 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
18750 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
18760 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
18770 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
18780 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
18790 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
187a0 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
187b0 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
187c0 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
187d0 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
187e0 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
187f0 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
18800 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
18810 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
18820 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
18830 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
18840 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
18850 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
18860 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
18870 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
18880 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
18890 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
188a0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
188b0 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
188c0 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
188d0 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
188e0 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
188f0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
18900 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
18910 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
18920 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
18930 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
18940 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
18950 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
18960 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
18970 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43  assert( p->uc.pC
18980 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
18990 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
189a0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
189b0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
189c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
189d0 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
189e0 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ore(p->uc.pCurso
189f0 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
18a00 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
18a10 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
18a20 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
18a30 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
18a40 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
18a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18a60 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72  * Check to ensur
18a70 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
18a80 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73  r is valid.  Res
18a90 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a  tore the cursor.
18aa0 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20  ** if need be.  
18ab0 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65  Return any I/O e
18ac0 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65  rror from the re
18ad0 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e  store operation.
18ae0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
18af0 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
18b00 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
18b10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
18b20 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
18b30 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73  BTREE );.  if( s
18b40 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18b50 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
18b60 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
18b70 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
18b80 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
18b90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18ba0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
18bb0 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
18bc0 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
18bd0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
18be0 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
18bf0 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
18c00 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
18c10 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
18c20 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
18c30 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
18c40 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
18c50 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
18c60 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
18c70 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
18c80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
18c90 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
18ca0 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
18cb0 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
18cc0 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
18cd0 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
18ce0 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
18cf0 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
18d00 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
18d10 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
18d20 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
18d30 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
18d40 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
18d50 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
18d60 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
18d70 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
18d80 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
18d90 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
18da0 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
18db0 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
18dc0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
18dd0 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
18de0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
18df0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
18e00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18e10 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
18e20 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69  beCursor **pp, i
18e30 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64  nt *piCol){.  Vd
18e40 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70  beCursor *p = *p
18e50 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
18e60 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
18e70 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43  E_BTREE || p->eC
18e80 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
18e90 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20  PSEUDO );.  if( 
18ea0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
18eb0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61  o ){.    int iMa
18ec0 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  p;.    if( p->aA
18ed0 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d  ltMap && (iMap =
18ee0 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70   p->aAltMap[1+*p
18ef0 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20  iCol])>0 ){.    
18f00 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43    *pp = p->pAltC
18f10 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69  ursor;.      *pi
18f20 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
18f30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18f40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18f50 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
18f60 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
18f70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
18f80 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
18f90 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
18fa0 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
18fb0 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
18fc0 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
18fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
18ff0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
19000 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
19010 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
19020 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
19030 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
19040 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19050 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
19060 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
19070 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
19080 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
19090 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
190a0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
190b0 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
190c0 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
190d0 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
190e0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
190f0 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
19100 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
19110 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
19120 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
19130 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
19140 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
19150 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
19160 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
19170 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
19180 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
19190 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
191a0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
191b0 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
191c0 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
191d0 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
191e0 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
191f0 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
19200 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
19210 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
19220 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
19230 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
19240 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
19250 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
19260 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
19270 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
19280 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
19290 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
192a0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
192b0 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
192c0 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
192d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
192e0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
192f0 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
19300 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
19310 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
19320 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
19330 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
19340 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
19350 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
19360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
19370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
19380 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
193a0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
193b0 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
193d0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
193e0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
193f0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
19400 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
19410 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
19420 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19440 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
19450 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
19460 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
19470 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
19480 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19490 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
194a0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
194b0 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
194c0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
194d0 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
19500 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
19510 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
19520 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
19530 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
19540 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19560 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
19570 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
19580 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
19590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
195a0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
195b0 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
195c0 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
195f0 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
19600 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
19610 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
19620 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
19630 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
19640 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
19650 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
19660 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
19670 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
19680 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
19690 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
196a0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
196b0 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
196c0 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
196d0 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
196e0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
196f0 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
19700 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
19710 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
19720 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
19730 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
19740 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
19750 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
19760 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
19770 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
19780 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
19790 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
197a0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
197b0 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
197c0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
197d0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
197e0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
197f0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
19800 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
19810 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
19820 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
19830 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
19840 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
19850 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
19860 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
19870 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
19880 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
19890 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
198a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
198b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
198c0 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
198d0 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
198e0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
198f0 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
19900 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
19910 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
19920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19930 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
19940 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19960 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
19970 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
19980 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
19990 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
199a0 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
199b0 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
199c0 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
199d0 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
199e0 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
199f0 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
19a00 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
19a10 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
19a20 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
19a30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
19a40 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
19a50 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
19a60 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
19a70 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
19a80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19a90 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
19aa0 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
19ab0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
19ac0 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
19ad0 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
19ae0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
19af0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
19b00 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
19b10 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
19b20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
19b30 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
19b40 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
19b50 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
19b60 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
19b70 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
19b80 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
19b90 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
19ba0 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
19bb0 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
19bc0 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
19bd0 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
19be0 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
19bf0 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
19c00 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
19c10 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
19c20 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
19c30 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
19c40 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
19c50 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
19c60 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
19c70 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
19c80 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
19c90 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
19ca0 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
19cb0 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
19cc0 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
19cd0 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
19ce0 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
19cf0 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
19d00 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
19d10 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
19d20 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
19d30 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
19d40 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
19d50 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
19d60 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
19d70 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
19d80 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
19d90 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
19da0 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
19db0 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
19dc0 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
19dd0 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
19de0 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
19df0 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
19e00 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
19e10 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
19e20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
19e30 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
19e40 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
19e50 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
19e60 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
19e70 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
19e80 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
19e90 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
19ea0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
19eb0 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
19ec0 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
19ed0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19ee0 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
19ef0 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
19f00 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
19f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
19f20 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
19f30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
19f40 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
19f50 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
19f60 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
19f70 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
19f80 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
19f90 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
19fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
19fb0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
19fc0 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
19fd0 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
19fe0 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
19ff0 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
1a000 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
1a010 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
1a020 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
1a030 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
1a040 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
1a050 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
1a060 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
1a070 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
1a080 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
1a090 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
1a0a0 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
1a0b0 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
1a0c0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
1a0d0 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
1a0e0 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
1a0f0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
1a100 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
1a110 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
1a120 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
1a130 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
1a140 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
1a150 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
1a160 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
1a170 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
1a180 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
1a190 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
1a1a0 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
1a1b0 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
1a1c0 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
1a1d0 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
1a1e0 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
1a1f0 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
1a200 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
1a210 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
1a220 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
1a230 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
1a240 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
1a250 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
1a260 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
1a270 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
1a280 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
1a290 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
1a2a0 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
1a2b0 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
1a2c0 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
1a2d0 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
1a2e0 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
1a2f0 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
1a300 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
1a310 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
1a320 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
1a330 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
1a340 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
1a350 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
1a360 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
1a370 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
1a380 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
1a390 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
1a3a0 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
1a3b0 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
1a3c0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1a3d0 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
1a3e0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1a3f0 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
1a400 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
1a410 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
1a420 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
1a430 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
1a440 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
1a450 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
1a460 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
1a470 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
1a480 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
1a490 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
1a4a0 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
1a4b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
1a4c0 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
1a4d0 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
1a4e0 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
1a4f0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
1a500 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
1a510 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
1a520 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
1a530 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
1a540 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
1a550 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
1a560 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
1a570 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1a580 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
1a590 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
1a5a0 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
1a5b0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
1a5c0 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
1a5d0 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
1a5e0 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
1a5f0 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
1a600 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
1a610 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
1a620 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
1a630 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
1a640 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
1a650 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
1a660 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
1a670 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
1a680 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
1a690 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
1a6a0 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
1a6b0 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
1a6c0 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
1a6d0 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
1a6e0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1a6f0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
1a700 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
1a710 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
1a720 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
1a730 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
1a740 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
1a750 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
1a760 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
1a770 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
1a780 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
1a790 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
1a7a0 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
1a7b0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1a7c0 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
1a7d0 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
1a7e0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
1a7f0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
1a800 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1a810 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
1a820 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
1a830 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
1a840 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
1a850 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
1a860 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1a870 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
1a880 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
1a890 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
1a8a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a8b0 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
1a8c0 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
1a8d0 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
1a8e0 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
1a8f0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
1a900 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
1a910 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
1a920 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
1a930 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
1a940 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
1a950 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
1a960 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
1a970 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
1a980 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
1a990 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1a9a0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1a9b0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
1a9c0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
1a9d0 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
1a9e0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
1a9f0 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
1aa00 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
1aa10 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
1aa20 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
1aa30 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
1aa40 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
1aa50 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
1aa60 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
1aa70 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
1aa80 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
1aa90 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
1aaa0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
1aab0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1aac0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
1aad0 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
1aae0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
1aaf0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ab00 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
1ab10 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
1ab20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1ab30 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
1ab40 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
1ab50 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
1ab60 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1ab70 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
1ab80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
1ab90 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1aba0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
1abb0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1abc0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1abd0 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
1abe0 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
1abf0 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
1ac00 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
1ac10 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
1ac20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
1ac30 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1ac40 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
1ac50 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
1ac60 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1ac70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ac80 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
1ac90 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1aca0 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
1acb0 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
1acc0 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
1acd0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1ace0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
1acf0 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
1ad00 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
1ad10 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
1ad20 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
1ad30 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
1ad40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
1ad50 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
1ad60 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
1ad70 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
1ad80 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
1ad90 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
1ada0 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
1adb0 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
1adc0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
1add0 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
1ade0 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
1adf0 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
1ae00 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
1ae10 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
1ae20 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
1ae30 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
1ae40 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
1ae50 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
1ae60 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
1ae70 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
1ae80 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
1ae90 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
1aea0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1aeb0 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
1aec0 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
1aed0 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1aee0 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
1aef0 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
1af00 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
1af10 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1af20 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1af30 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
1af40 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
1af50 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
1af60 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
1af70 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
1af80 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
1af90 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
1afa0 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
1afb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1afc0 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
1afd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1afe0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1aff0 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
1b000 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
1b010 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
1b020 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
1b030 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
1b040 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
1b050 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
1b060 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
1b070 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
1b080 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
1b090 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
1b0a0 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
1b0b0 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
1b0c0 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
1b0d0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
1b0e0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
1b0f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1b100 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
1b110 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1b120 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
1b130 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
1b140 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1b150 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
1b160 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
1b170 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
1b180 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1b190 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
1b1a0 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
1b1b0 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
1b1c0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
1b1d0 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
1b1e0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
1b1f0 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
1b200 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
1b210 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
1b220 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b230 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
1b240 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1b250 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
1b260 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1b270 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1b280 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
1b290 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
1b2a0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1b2b0 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
1b2c0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1b2d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1b2e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1b2f0 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
1b300 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1b310 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
1b320 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
1b330 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
1b340 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
1b350 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
1b360 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b370 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1b380 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
1b390 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
1b3a0 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
1b3b0 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
1b3c0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1b3d0 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
1b3e0 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
1b3f0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1b400 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
1b410 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
1b420 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
1b430 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
1b440 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
1b450 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
1b460 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
1b470 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
1b480 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
1b490 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
1b4a0 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
1b4b0 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
1b4c0 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
1b4d0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1b4e0 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
1b4f0 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
1b500 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
1b510 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
1b520 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
1b530 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1b540 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1b550 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1b560 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1b570 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1b580 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1b590 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1b5a0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1b5b0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1b5c0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
1b5d0 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
1b5e0 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
1b5f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
1b600 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
1b610 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
1b620 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b630 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1b640 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1b650 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1b660 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1b670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b680 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1b690 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1b6a0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b6c0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1b6d0 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1b6e0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
1b6f0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1b700 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a     case 10: { /*
1b710 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   Internal use on
1b720 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69  ly: NULL with vi
1b730 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
1b740 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50             ** UP
1b750 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66  DATE no-change f
1b760 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  lag set */.     
1b770 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1b780 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f  EM_Null|MEM_Zero
1b790 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1b7a0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  = 0;.      pMem-
1b7b0 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20  >u.nZero = 0;.  
1b7c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b7d0 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
1b7e0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
1b7f0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
1b800 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
1b810 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  Null */.      /*
1b820 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1b830 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75  24078-09375 Valu
1b840 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a  e is a NULL. */.
1b850 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1b860 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
1b870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b880 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
1b890 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1b8a0 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31  -OF: R-44885-251
1b8b0 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38  96 Value is an 8
1b8c0 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
1b8d0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ment.      ** in
1b8e0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1b8f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
1b900 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1b910 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1b920 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1b930 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1b940 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1b950 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1b960 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
1b970 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
1b980 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1b990 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b9a0 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56   R-49794-35026 V
1b9b0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1b9c0 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20  dian 16-bit.    
1b9d0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1b9e0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1b9f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1ba00 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1ba10 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1ba20 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1ba30 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1ba40 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1ba50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
1ba60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ba70 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1ba80 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1ba90 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1baa0 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d  NCE-OF: R-37839-
1bab0 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61  54301 Value is a
1bac0 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62   big-endian 24-b
1bad0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1bae0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1baf0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1bb00 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
1bb10 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1bb20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1bb30 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1bb40 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1bb50 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1bb60 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
1bb70 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1bb80 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1bb90 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1bba0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1bbb0 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56   R-01849-26079 V
1bbc0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1bbd0 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20  dian 32-bit.    
1bbe0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1bbf0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1bc00 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1bc10 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
1bc20 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f  (buf);.#ifdef __
1bc30 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20  HP_cc .      /* 
1bc40 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69  Work around a si
1bc50 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67  gn-extension bug
1bc60 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69   in the HP compi
1bc70 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f  ler for HP/UX */
1bc80 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30  .      if( buf[0
1bc90 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75  ]&0x80 ) pMem->u
1bca0 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66  .i |= 0xffffffff
1bcb0 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64  80000000LL;.#end
1bcc0 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  if.      pMem->f
1bcd0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1bce0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bcf0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1bd00 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
1bd10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1bd20 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1bd30 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1bd40 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1bd50 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
1bd60 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
1bd70 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
1bd80 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1bd90 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1bda0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1bdb0 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
1bdc0 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
1bdd0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1bde0 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1bdf0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1be00 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1be10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1be20 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1be30 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
1be40 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
1be50 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1be60 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1be70 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
1be80 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
1be90 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
1bea0 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
1beb0 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
1bec0 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
1bed0 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
1bee0 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
1bef0 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
1bf00 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
1bf10 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1bf20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1bf30 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
1bf40 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
1bf50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bf60 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
1bf70 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
1bf80 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
1bf90 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
1bfa0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
1bfb0 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
1bfc0 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
1bfd0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1bfe0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
1bff0 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
1c000 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
1c010 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1c020 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
1c030 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
1c040 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c050 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1c060 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1c070 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
1c080 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
1c090 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
1c0a0 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
1c0b0 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
1c0c0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
1c0d0 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
1c0e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
1c0f0 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
1c100 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
1c110 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
1c120 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
1c130 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
1c140 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
1c150 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
1c160 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
1c170 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
1c180 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
1c190 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
1c1a0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
1c1b0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
1c1c0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1c1d0 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
1c1e0 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
1c1f0 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
1c200 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
1c210 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
1c220 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
1c230 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c240 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
1c250 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
1c260 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
1c270 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
1c280 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
1c290 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
1c2a0 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
1c2b0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
1c2c0 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
1c2d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1c2e0 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
1c2f0 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
1c300 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
1c310 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
1c320 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
1c330 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1c340 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
1c350 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
1c360 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
1c370 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
1c380 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
1c390 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
1c3a0 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
1c3b0 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
1c3c0 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
1c3d0 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
1c3e0 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
1c3f0 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
1c400 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1c410 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1c420 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
1c430 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
1c440 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
1c450 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
1c460 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
1c470 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
1c480 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
1c490 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1c4a0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1c4b0 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1c4c0 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
1c4d0 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
1c4e0 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
1c4f0 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
1c500 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1c510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1c520 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1c530 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  e record */.){. 
1c540 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c550 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1c560 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
1c570 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
1c580 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c5b0 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1c5c0 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65  or *p */.  nByte
1c5d0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
1c5e0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1c5f0 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
1c600 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  (pKeyInfo->nKeyF
1c610 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28  ield+1);.  p = (
1c620 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1c630 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1c640 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
1c650 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
1c660 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
1c670 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
1c680 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
1c690 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1c6a0 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
1c6b0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1c6c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1c6d0 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
1c6e0 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1c6f0 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
1c700 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b  nfo->nKeyField +
1c710 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1c720 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1c730 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1c740 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1c750 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1c760 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1c770 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1c780 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1c790 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1c7a0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1c7b0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1c7c0 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1c7d0 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1c7e0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1c7f0 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1c800 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1c810 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1c820 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1c830 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1c840 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1c850 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c860 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1c870 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1c880 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1c890 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1c8a0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1c8b0 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1c8c0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1c8d0 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1c8e0 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1c8f0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1c900 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1c910 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c920 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
1c930 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c950 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1c960 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1c970 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1c980 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1c990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c9a0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1c9b0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1c9c0 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1c9d0 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1c9e0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1c9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1ca00 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1ca10 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1ca20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1ca30 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1ca40 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1ca50 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1ca60 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
1ca70 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
1ca80 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
1ca90 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1caa0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
1cab0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
1cac0 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
1cad0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
1cae0 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
1caf0 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
1cb00 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
1cb10 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1cb20 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
1cb30 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
1cb40 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1cb50 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d  oc = 0;.    pMem
1cb60 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  ->z = 0;.    d +
1cb70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1cb80 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
1cb90 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
1cba0 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
1cbb0 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
1cbc0 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
1cbd0 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
1cbe0 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b   u<=pKeyInfo->nK
1cbf0 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  eyField + 1 );. 
1cc00 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1cc10 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1cc20 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
1cc30 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1cc40 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72  res two index or
1cc50 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65   table record ke
1cc60 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ys in the same w
1cc70 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c  ay.** as the sql
1cc80 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1cc90 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e  mpare() routine.
1cca0 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f   Unlike VdbeReco
1ccb0 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20  rdCompare(),.** 
1ccc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
1ccd0 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63  serializes and c
1cce0 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75  ompares values u
1ccf0 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
1cd00 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1cd10 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65  () and sqlite3Me
1cd20 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74  mCompare() funct
1cd30 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64  ions. It is used
1cd40 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
1cd50 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
1cd60 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70  sure that the op
1cd70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a  timized code in.
1cd80 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
1cd90 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65  cordCompare() re
1cda0 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69  turns results wi
1cdb0 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69  th these two pri
1cdc0 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  mitives..**.** R
1cdd0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1cde0 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1cdf0 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61  arison is equiva
1ce00 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52  lent to desiredR
1ce10 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  esult..** Return
1ce20 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20   false if there 
1ce30 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e  is a disagreemen
1ce40 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1ce50 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1ce60 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e  reDebug(.  int n
1ce70 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1ce80 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1ce90 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1cea0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1ceb0 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74  pPKey2, /* Right
1cec0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65   key */.  int de
1ced0 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20  siredResult     
1cee0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65          /* Corre
1cef0 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a  ct answer */.){.
1cf00 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1cf10 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1cf20 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1cf30 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1cf40 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1cf50 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1cf60 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1cf70 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
1cf80 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
1cf90 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
1cfa0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1cfb0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1cfc0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1cfd0 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
1cfe0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1cff0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1d000 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1d010 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
1d020 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
1d030 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
1d040 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1d050 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79  Info;.  if( pKey
1d060 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65  Info->db==0 ) re
1d070 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65  turn 1;.  mem1.e
1d080 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1d090 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20  nc;.  mem1.db = 
1d0a0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1d0b0 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  /* mem1.flags = 
1d0c0 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69  0;  // Will be i
1d0d0 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71  nitialized by sq
1d0e0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1d0f0 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e  et() */.  VVA_ON
1d100 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1d110 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1d120 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1d130 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1d140 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
1d150 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
1d160 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
1d170 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
1d180 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
1d190 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
1d1a0 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
1d1b0 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
1d1c0 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
1d1d0 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
1d1e0 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
1d1f0 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
1d200 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
1d210 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
1d220 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
1d230 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
1d240 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
1d250 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
1d260 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
1d270 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
1d280 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1d290 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
1d2a0 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
1d2b0 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
1d2c0 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
1d2d0 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
1d2e0 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
1d2f0 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
1d300 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
1d310 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
1d320 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
1d330 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
1d340 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
1d350 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
1d360 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1d370 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20   szHdr1);.  if( 
1d380 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72  szHdr1>98307 ) r
1d390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d3a0 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48  RUPT;.  d1 = szH
1d3b0 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr1;.  assert( p
1d3c0 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1d3d0 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1d3e0 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
1d3f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1d400 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1d410 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1d420 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  t( pKeyInfo->nKe
1d430 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  yField>0 );.  as
1d440 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
1d450 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
1d460 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
1d470 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
1d480 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1d490 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
1d4a0 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
1d4b0 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
1d4c0 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
1d4d0 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
1d4e0 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
1d4f0 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ype1 );..    /* 
1d500 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72  Verify that ther
1d510 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20  e is enough key 
1d520 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20  space remaining 
1d530 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20  to avoid.    ** 
1d540 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  a buffer overrea
1d550 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69  d.  The "d1+seri
1d560 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65  al_type1+2" sube
1d570 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20  xpression will. 
1d580 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
1d590 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1d5a0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f  equal to the amo
1d5b0 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20  unt of required 
1d5c0 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  key space..    *
1d5d0 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f  * Use that appro
1d5e0 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69  ximation to avoi
1d5f0 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e  d the more expen
1d600 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20  sive call to.   
1d610 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53   ** sqlite3VdbeS
1d620 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69  erialTypeLen() i
1d630 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1d640 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d650 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65  ( d1+serial_type
1d660 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20  1+2>(u32)nKey1. 
1d670 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65      && d1+sqlite
1d680 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1d690 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
1d6a0 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20  >(u32)nKey1 .   
1d6b0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1d6c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
1d6d0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1d6e0 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
1d6f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
1d700 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1d710 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1d720 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
1d730 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
1d740 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
1d750 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
1d760 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
1d770 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
1d780 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70  Key2->aMem[i], p
1d790 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1d7a0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
1d7b0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1d7c0 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1d7d0 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1d7e0 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1d7f0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1d800 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1d810 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1d820 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72  = -rc;  /* Inver
1d830 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  t the result for
1d840 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
1d850 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
1d860 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d     goto debugCom
1d870 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20  pareEnd;.    }. 
1d880 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65     i++;.  }while
1d890 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
1d8a0 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1d8b0 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  d );..  /* No me
1d8c0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1d8d0 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1d8e0 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1d8f0 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1d900 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1d910 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1d920 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1d930 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1d940 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1d950 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1d960 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1d970 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
1d980 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1d990 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1d9a0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1d9b0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1d9c0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
1d9d0 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
1d9e0 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
1d9f0 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
1da00 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
1da10 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
1da20 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
1da30 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  alue.  */.  rc =
1da40 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1da50 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61  _rc;..debugCompa
1da60 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73  reEnd:.  if( des
1da70 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26  iredResult==0 &&
1da80 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   rc==0 ) return 
1da90 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1daa0 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30  Result<0 && rc<0
1dab0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1dac0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1dad0 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74  >0 && rc>0 ) ret
1dae0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52  urn 1;.  if( COR
1daf0 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1db00 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   1;.  if( pKeyIn
1db10 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1db20 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1db30 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1db40 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1db50 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1db60 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1db70 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b  r of fields (a.k
1db80 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20  .a. columns) in 
1db90 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
1dba0 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79   by.** pKey,nKey
1dbb0 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68  .  The verify th
1dbc0 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73  at this count is
1dbd0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1dbe0 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69  ual to the.** li
1dbf0 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65  mit given by pKe
1dc00 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1dc10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1dc20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f  constraint is no
1dc30 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20  t satisfied, it 
1dc40 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68  means that the h
1dc50 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62  igh-speed.** vdb
1dc60 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1dc70 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f  t() and vdbeReco
1dc80 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1dc90 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a  ) routines will.
1dca0 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ** not work corr
1dcb0 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20  ectly.  If this 
1dcc0 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69  assert() ever fi
1dcd0 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79  res, it probably
1dce0 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74   means.** that t
1dcf0 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46  he KeyInfo.nKeyF
1dd00 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1dd10 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65 73  nAllField values
1dd20 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a   were computed.*
1dd30 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  * incorrectly..*
1dd40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
1dd50 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1dd60 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a  ntWithinLimits(.
1dd70 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
1dd80 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1dd90 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f  /* The record to
1dda0 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f   verify */ .  co
1ddb0 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  nst KeyInfo *pKe
1ddc0 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43  yInfo       /* C
1ddd0 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68  ompare size with
1dde0 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f   this KeyInfo */
1ddf0 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  .){.  int nField
1de00 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64   = 0;.  u32 szHd
1de10 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  r;.  u32 idx;.  
1de20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63  u32 notUsed;.  c
1de30 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1de40 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1de50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1de60 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f  )pKey;..  if( CO
1de70 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1de80 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  n;.  idx = getVa
1de90 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1dea0 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  dr);.  assert( n
1deb0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
1dec0 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29  rt( szHdr<=(u32)
1ded0 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28  nKey );.  while(
1dee0 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20   idx<szHdr ){.  
1def0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1df00 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e  nt32(aKey+idx, n
1df10 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69  otUsed);.    nFi
1df20 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  eld++;.  }.  ass
1df30 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70  ert( nField <= p
1df40 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
1df50 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ld );.}.#else.# 
1df60 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72  define vdbeAsser
1df70 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1df80 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23  nLimits(A,B,C).#
1df90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74  endif../*.** Bot
1dfa0 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d  h *pMem1 and *pM
1dfb0 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69  em2 contain stri
1dfc0 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61  ng values. Compa
1dfd0 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  re the two value
1dfe0 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63  s.** using the c
1dff0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1e000 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61  e pColl. As usua
1e010 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61  l, return a nega
1e020 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  tive , zero.** o
1e030 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  r positive value
1e040 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65   if *pMem1 is le
1e050 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1e060 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  o or greater tha
1e070 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65  n .** *pMem2, re
1e080 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69  spectively. Simi
1e090 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f  lar in spirit to
1e0a0 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20   "rc = (*pMem1) 
1e0b0 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f  - (*pMem2);"..*/
1e0c0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1e0d0 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1e0e0 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  (.  const Mem *p
1e0f0 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65  Mem1,.  const Me
1e100 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73  m *pMem2,.  cons
1e110 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1e120 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20  ,.  u8 *prcErr  
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e140 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d      /* If an OOM
1e150 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20   occurs, set to 
1e160 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a  SQLITE_NOMEM */.
1e170 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  ){.  if( pMem1->
1e180 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
1e190 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ){.    /* The st
1e1a0 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64  rings are alread
1e1b0 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  y in the correct
1e1c0 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c   encoding.  Call
1e1d0 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d   the.     ** com
1e1e0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
1e1f0 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20   directly */.   
1e200 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78   return pColl->x
1e210 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1e220 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d  ,pMem1->n,pMem1-
1e230 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d  >z,pMem2->n,pMem
1e240 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2->z);.  }else{.
1e250 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1e260 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
1e270 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b  *v2;.    Mem c1;
1e280 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20  .    Mem c2;.   
1e290 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1e2a0 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e  nit(&c1, pMem1->
1e2b0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1e2c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e2d0 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31  mInit(&c2, pMem1
1e2e0 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1e2f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e300 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1e310 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45  c1, pMem1, MEM_E
1e320 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  phem);.    sqlit
1e330 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1e340 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c  Copy(&c2, pMem2,
1e350 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1e360 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v1 = sqlite3Val
1e370 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1e380 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c  value*)&c1, pCol
1e390 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32 20  l->enc);.    v2 
1e3a0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1e3b0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1e3c0 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c2, pColl->e
1e3d0 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  nc);.    if( (v1
1e3e0 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b  ==0 || v2==0) ){
1e3f0 0a 20 20 20 20 20 20 69 66 28 20 70 72 63 45 72  .      if( prcEr
1e400 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51  r ) *prcErr = SQ
1e410 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1e420 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
1e430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e440 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1e450 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63  (pColl->pUser, c
1e460 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76  1.n, v1, c2.n, v
1e470 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
1e480 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e490 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
1e4a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e4b0 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65  ase(&c2);.    re
1e4c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1e4d0 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
1e4e0 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74  pBlob is guarant
1e4f0 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62  eed to be a Blob
1e500 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72   that is not mar
1e510 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f  ked.** with MEM_
1e520 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72  Zero.  Return tr
1e530 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62  ue if it could b
1e540 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a  e a zero-blob..*
1e550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
1e560 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61  llZero(const cha
1e570 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
1e580 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1e590 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1e5a0 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75   if( z[i] ) retu
1e5b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1e5c0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1e5d0 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73  ompare two blobs
1e5e0 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1e5f0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1e600 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1e610 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  st.** is less th
1e620 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1e630 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1e640 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63  e second, respec
1e650 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e  tively..** If on
1e660 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66  e blob is a pref
1e670 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
1e680 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65   then the shorte
1e690 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e  r is the lessor.
1e6a0 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  .*/.SQLITE_NOINL
1e6b0 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42  INE int sqlite3B
1e6c0 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  lobCompare(const
1e6d0 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74   Mem *pB1, const
1e6e0 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e   Mem *pB2){.  in
1e6f0 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20  t c;.  int n1 = 
1e700 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32  pB1->n;.  int n2
1e710 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a   = pB2->n;..  /*
1e720 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
1e730 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76  to have a Blob v
1e740 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73 6f  alue that has so
1e750 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74  me non-zero cont
1e760 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65  ent.  ** followe
1e770 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e  d by zero conten
1e780 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c  t.  But that onl
1e790 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42  y comes up for B
1e7a0 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a  lobs formed.  **
1e7b0 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1e7c0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e  ecord opcode, an
1e7d0 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76  d such Blobs nev
1e7e0 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69 6e  er get passed in
1e7f0 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d  to.  ** sqlite3M
1e800 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a  emCompare(). */.
1e810 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e    assert( (pB1->
1e820 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1e830 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b  )==0 || n1==0 );
1e840 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32 2d  .  assert( (pB2-
1e850 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1e860 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29  o)==0 || n2==0 )
1e870 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66  ;..  if( (pB1->f
1e880 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29  lags|pB2->flags)
1e890 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1e8a0 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67     if( pB1->flag
1e8b0 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26  s & pB2->flags &
1e8c0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1e8d0 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75     return pB1->u
1e8e0 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e  .nZero - pB2->u.
1e8f0 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  nZero;.    }else
1e900 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20   if( pB1->flags 
1e910 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1e920 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1e930 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e  ro(pB2->z, pB2->
1e940 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  n) ) return -1;.
1e950 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31        return pB1
1e960 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a  ->u.nZero - n2;.
1e970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e980 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28   if( !isAllZero(
1e990 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20  pB1->z, pB1->n) 
1e9a0 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1e9b0 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70     return n1 - p
1e9c0 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  B2->u.nZero;.   
1e9d0 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d   }.  }.  c = mem
1e9e0 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d  cmp(pB1->z, pB2-
1e9f0 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a  >z, n1>n2 ? n2 :
1ea00 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20   n1);.  if( c ) 
1ea10 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75  return c;.  retu
1ea20 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f  rn n1 - n2;.}../
1ea30 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72  *.** Do a compar
1ea40 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36  ison between a 6
1ea50 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
1ea60 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69  eger and a 64-bi
1ea70 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  t floating-point
1ea80 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  .** number.  Ret
1ea90 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1eaa0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1eab0 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36  if the first (i6
1eac0 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  4) is less than,
1ead0 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  .** equal to, or
1eae0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1eaf0 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65  e second (double
1eb00 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1eb10 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1eb20 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64  Compare(i64 i, d
1eb30 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20  ouble r){.  if( 
1eb40 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c  sizeof(LONGDOUBL
1eb50 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20  E_TYPE)>8 ){.   
1eb60 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
1eb70 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45   x = (LONGDOUBLE
1eb80 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28  _TYPE)i;.    if(
1eb90 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   x<r ) return -1
1eba0 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20  ;.    if( x>r ) 
1ebb0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1ebc0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1ebd0 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20  {.    i64 y;.   
1ebe0 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69   double s;.    i
1ebf0 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36  f( r<-9223372036
1ec00 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65  854775808.0 ) re
1ec10 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28  turn +1;.    if(
1ec20 20 72 3e 3d 39 32 32 33 33 37 32 30 33 36 38 35   r>=922337203685
1ec30 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75  4775808.0 ) retu
1ec40 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28  rn -1;.    y = (
1ec50 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69  i64)r;.    if( i
1ec60 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <y ) return -1;.
1ec70 20 20 20 20 69 66 28 20 69 3e 79 20 29 20 72 65      if( i>y ) re
1ec80 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 73 20 3d  turn +1;.    s =
1ec90 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20   (double)i;.    
1eca0 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e  if( s<r ) return
1ecb0 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72   -1;.    if( s>r
1ecc0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ecd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1ece0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1ecf0 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
1ed00 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
1ed10 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
1ed20 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
1ed30 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
1ed40 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
1ed50 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1ed60 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1ed70 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
1ed80 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
1ed90 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
1eda0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
1edb0 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
1edc0 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
1edd0 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
1ede0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
1edf0 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
1ee00 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1ee10 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
1ee20 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
1ee30 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
1ee40 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
1ee50 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
1ee60 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
1ee70 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1ee80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ee90 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
1eea0 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
1eeb0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
1eec0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1eed0 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20  oll){.  int f1, 
1eee0 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
1eef0 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
1ef00 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
1ef10 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
1ef20 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
1ef30 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
1ef40 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
1ef50 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74  3VdbeMemIsRowSet
1ef60 28 70 4d 65 6d 31 29 20 26 26 20 21 73 71 6c 69  (pMem1) && !sqli
1ef70 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
1ef80 65 74 28 70 4d 65 6d 32 29 20 29 3b 0a 20 0a 20  et(pMem2) );. . 
1ef90 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1efa0 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
1efb0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
1efc0 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
1efd0 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
1efe0 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
1eff0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1f000 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
1f010 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
1f020 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
1f030 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
1f040 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  ..  /* At least 
1f050 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76  one of the two v
1f060 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65  alues is a numbe
1f070 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  r.  */.  if( com
1f080 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1f090 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1f0a0 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1f0b0 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
1f0c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1f0d0 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
1f0e0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
1f0f0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1f100 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
1f110 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.i ) return +1
1f120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1f130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f140 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52  (f1 & f2 & MEM_R
1f150 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1f160 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1f170 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  < pMem2->u.r ) r
1f180 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1f190 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e  if( pMem1->u.r >
1f1a0 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1f1b0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1f1c0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1f1d0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49     if( (f1&MEM_I
1f1e0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1f1f0 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
1f200 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f210 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
1f220 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
1f230 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d  em1->u.i, pMem2-
1f240 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
1f250 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1f260 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
1f270 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1f280 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1f290 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1f2a0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1f2b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71        return -sq
1f2c0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1f2d0 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c  pare(pMem2->u.i,
1f2e0 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20   pMem1->u.r);.  
1f2f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f300 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1f310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f320 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a  return +1;.  }..
1f330 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1f340 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
1f350 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1f360 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1f370 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1f380 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1f390 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1f3a0 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1f3b0 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1f3c0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1f3d0 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1f3e0 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1f3f0 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1f400 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1f410 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1f420 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1f430 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1f440 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1f450 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1f460 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70  =pMem2->enc || p
1f470 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Mem1->db->malloc
1f480 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
1f490 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1f4a0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1f4b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1f4c0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1f4d0 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1f4e0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1f4f0 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1f500 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1f510 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1f520 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1f530 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1f540 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1f550 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1f560 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1f570 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1f580 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1f590 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1f5a0 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1f5b0 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1f5c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1f5d0 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1f5e0 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1f5f0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1f600 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1f610 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1f620 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1f630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1f640 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1f650 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1f660 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1f670 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1f680 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1f690 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1f6a0 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1f6b0 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1f6c0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1f6d0 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1f6e0 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1f6f0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1f700 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1f710 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1f720 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1f730 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1f740 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1f750 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1f760 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1f770 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1f780 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1f790 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1f7a0 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1f7b0 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1f7c0 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1f7d0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1f7e0 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1f7f0 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1f800 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1f810 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1f820 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1f830 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1f840 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1f850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1f860 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1f870 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1f880 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1f890 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1f8a0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1f8b0 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1f8c0 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1f8d0 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1f8e0 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1f8f0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1f900 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1f910 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1f920 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f930 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1f940 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1f950 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1f960 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1f970 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1f980 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1f990 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
1f9a0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1f9b0 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
1f9c0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1f9d0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1f9e0 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1f9f0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1fa00 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1fa10 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1fa20 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1fa30 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1fa40 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1fa50 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1fa60 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1fa70 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1fa80 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1fa90 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1faa0 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1fab0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1fac0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1fad0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1fae0 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1faf0 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1fb00 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1fb10 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1fb20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1fb30 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1fb40 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1fb50 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1fb60 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1fb70 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1fb80 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1fb90 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1fba0 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1fbb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1fbc0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1fbd0 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1fbe0 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1fbf0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1fc00 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1fc10 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1fc20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1fc30 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1fc40 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1fc50 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1fc60 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1fc70 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1fc80 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1fc90 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1fca0 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1fcb0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1fcc0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1fcd0 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1fce0 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1fcf0 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1fd00 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1fd10 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1fd20 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1fd30 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1fd40 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1fd50 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1fd60 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1fd70 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1fd80 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1fd90 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1fda0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1fdb0 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1fdc0 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1fdd0 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1fde0 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1fdf0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1fe00 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1fe10 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1fe20 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1fe30 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1fe40 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1fe50 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1fe60 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1fe70 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1fe80 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1fe90 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1fea0 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1feb0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1fec0 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1fed0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1fee0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1fef0 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1ff00 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1ff10 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1ff20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1ff30 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1ff40 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1ff50 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1ff60 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1ff70 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
1ff80 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1ff90 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1ffa0 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1ffb0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1ffc0 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1ffd0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1ffe0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1fff0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
20000 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
20010 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
20020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
20030 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
20040 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
20050 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
20080 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
20090 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
200a0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
200d0 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
200e0 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
200f0 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
20100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20110 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
20120 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
20130 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
20160 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
20170 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
20180 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20190 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
201a0 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
201b0 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
201c0 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
201d0 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
201e0 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
201f0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
20200 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
20210 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
20220 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
20230 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
20240 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
20250 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
20260 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
20270 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
20280 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
20290 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
202a0 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
202b0 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
202c0 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
202d0 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
202e0 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
202f0 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
20300 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
20310 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
20320 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
20330 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
20340 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
20350 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
20360 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
20370 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
20380 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
20390 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
203a0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
203b0 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
203c0 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
203d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
203e0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
203f0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
20400 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
20410 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69      if( d1>(unsi
20420 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20  gned)nKey1 ){ . 
20430 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
20440 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
20450 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20460 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
20470 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
20480 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  /.    }.    i = 
20490 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e  0;.  }..  VVA_ON
204a0 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
204b0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
204c0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
204d0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
204e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  /.  assert( pPKe
204f0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  y2->pKeyInfo->nA
20500 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  llField>=pPKey2-
20510 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
20520 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
20530 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
20540 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
20550 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
20560 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
20570 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
20580 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
20590 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
205a0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
205b0 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
205c0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
205d0 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e   /* RHS is an in
205e0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  teger */.    if(
205f0 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
20600 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
20610 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
20620 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
20630 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
20640 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
20650 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
20660 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
20670 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
20680 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
20690 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
206a0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
206b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
206c0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
206d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
206e0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
206f0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
20700 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
20710 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c         rc = -sql
20720 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
20730 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d  are(pRhs->u.i, m
20740 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em1.u.r);.      
20750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
20760 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63  64 lhs = vdbeRec
20770 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72  ordDecodeInt(ser
20780 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31  ial_type, &aKey1
20790 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [d1]);.        i
207a0 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  64 rhs = pRhs->u
207b0 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  .i;.        if( 
207c0 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
207d0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
207e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
207f0 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
20800 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
20810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20820 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
20830 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20  S is real */.   
20840 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
20850 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
20860 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
20870 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
20880 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  x1];.      if( s
20890 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
208a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72  {.        /* Ser
208b0 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20  ial types 12 or 
208c0 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69  greater are stri
208d0 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67  ngs and blobs (g
208e0 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20  reater than.    
208f0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e      ** numbers).
20900 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31   Types 10 and 11
20910 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22   are currently "
20920 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  reserved for fut
20930 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
20940 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73  use", so it does
20950 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65  n't really matte
20960 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c  r what the resul
20970 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a  ts of comparing.
20980 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20          ** them 
20990 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75  to numberic valu
209a0 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20  es are.  */.    
209b0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
209c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
209d0 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
209e0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
209f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20a00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20a10 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
20a20 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
20a30 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
20a40 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
20a50 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
20a60 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c     if( mem1.u.r<
20a70 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
20a80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
20a90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
20aa0 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70  e if( mem1.u.r>p
20ab0 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
20ac0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
20ad0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20ae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20af0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20b00 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
20b10 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73  e(mem1.u.i, pRhs
20b20 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20  ->u.r);.        
20b30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
20b40 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
20b50 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65   string */.    e
20b60 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
20b70 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
20b80 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
20b90 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
20ba0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
20bb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
20bc0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
20bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
20be0 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
20bf0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
20c00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
20c10 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
20c20 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
20c30 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
20c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
20c50 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74  m1.n = (serial_t
20c60 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
20c70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20c80 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75   (d1+mem1.n)==(u
20c90 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
20ca0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20cb0 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29  e( (d1+mem1.n+1)
20cc0 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
20cd0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
20ce0 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28   (d1+mem1.n) > (
20cf0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
20d00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
20d10 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
20d20 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
20d30 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
20d40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
20d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
20d60 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
20d70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4b     }else if( (pK
20d80 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
20d90 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e 61 43 6f 6c  >pKeyInfo)->aCol
20da0 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
20db0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
20dc0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
20dd0 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
20de0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
20df0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
20e00 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
20e10 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
20e20 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64   (char*)&aKey1[d
20e30 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1];.          rc
20e40 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65   = vdbeCompareMe
20e50 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20  mString(.       
20e60 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52         &mem1, pR
20e70 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  hs, pKeyInfo->aC
20e80 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d  oll[i], &pPKey2-
20e90 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20  >errCode.       
20ea0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
20eb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
20ec0 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
20ed0 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
20ee0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
20ef0 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
20f00 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
20f10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20f20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
20f30 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
20f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20f50 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
20f60 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
20f70 0a 20 20 20 20 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 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73  Blob ){.      as
20fa0 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61  sert( (pRhs->fla
20fb0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
20fc0 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20  0 || pRhs->n==0 
20fd0 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  );.      getVari
20fe0 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
20ff0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
21000 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21010 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
21020 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
21030 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20  rial_type<12 || 
21040 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
21050 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
21060 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
21070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
21080 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c  t nStr = (serial
21090 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
210a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
210b0 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75  e( (d1+nStr)==(u
210c0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
210d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
210e0 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d  e( (d1+nStr+1)==
210f0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
21100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
21110 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
21120 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
21130 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
21140 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
21150 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21160 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
21170 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21180 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
21190 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
211a0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
211b0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
211c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
211d0 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e   !isAllZero((con
211e0 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  st char*)&aKey1[
211f0 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20  d1],nStr) ){.   
21200 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
21210 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21220 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
21230 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
21240 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20  u.nZero;.       
21250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
21260 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
21270 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
21280 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
21290 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
212a0 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
212b0 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
212c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
212d0 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
212e0 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
212f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21300 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
21310 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
21320 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
21330 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
21340 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
21350 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
21360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
21370 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
21380 66 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  f( pPKey2->pKeyI
21390 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
213a0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
213b0 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
213c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64        assert( vd
213d0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
213e0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
213f0 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29  1, pPKey2, rc) )
21400 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21410 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
21420 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
21430 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
21440 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21450 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20    }..    i++;.  
21460 20 20 69 66 28 20 69 3d 3d 70 50 4b 65 79 32 2d    if( i==pPKey2-
21470 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b  >nField ) break;
21480 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
21490 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
214a0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
214b0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
214c0 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
214d0 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
214e0 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
214f0 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
21500 64 29 73 7a 48 64 72 31 20 26 26 20 64 31 3c 3d  d)szHdr1 && d1<=
21510 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
21520 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
21530 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
21540 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
21550 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
21560 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
21570 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
21580 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
21590 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
215a0 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
215b0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
215c0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
215d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
215e0 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a  ase(&mem1).  */.
215f0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
21600 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
21610 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
21620 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72  eans that one or
21630 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79   both of the key
21640 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
21650 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
21660 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
21670 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
21680 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
21690 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
216a0 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
216b0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
216c0 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76  _DB .       || v
216d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
216e0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
216f0 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65  y1, pPKey2, pPKe
21700 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20  y2->default_rc) 
21710 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
21720 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
21730 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
21740 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  );.  pPKey2->eqS
21750 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  een = 1;.  retur
21760 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
21770 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
21780 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21790 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
217a0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
217b0 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
217c0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
217d0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
217e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
217f0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
21800 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
21810 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
21820 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
21830 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a  y1, pPKey2, 0);.
21840 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
21850 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
21860 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
21870 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
21880 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
21890 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
218a0 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
218b0 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67  Key2 is an integ
218c0 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20  er, and (b) the 
218d0 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  .** size-of-head
218e0 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65  er varint at the
218f0 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
21900 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
21910 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65  a single.** byte
21920 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74   (i.e. is less t
21930 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20  han 128)..**.** 
21940 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e  To avoid concern
21950 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f  s about buffer o
21960 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72  verreads, this r
21970 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
21980 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61  sed.** on schema
21990 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69  s where the maxi
219a0 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72  mum valid header
219b0 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65   size is 63 byte
219c0 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74  s or less..*/.st
219d0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
219e0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
219f0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
21a00 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
21a10 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
21a20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
21a30 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
21a40 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
21a50 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
21a60 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a  y = &((const u8*
21a70 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20  )pKey1)[*(const 
21a80 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46  u8*)pKey1 & 0x3F
21a90 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  ];.  int serial_
21aa0 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75  type = ((const u
21ab0 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20  8*)pKey1)[1];.  
21ac0 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79  int res;.  u32 y
21ad0 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34  ;.  u64 x;.  i64
21ae0 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a   v;.  i64 lhs;..
21af0 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
21b00 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
21b10 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
21b20 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
21b30 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
21b40 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
21b50 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
21b60 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
21b70 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
21b80 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
21b90 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
21ba0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
21bb0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
21bc0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
21bd0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
21be0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21bf0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
21c00 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
21c10 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
21c20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
21c30 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
21c40 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
21c50 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
21c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21c70 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
21c80 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
21c90 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
21ca0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
21cb0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
21cc0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
21cd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21ce0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
21cf0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
21d00 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
21d10 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
21d20 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
21d30 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
21d40 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
21d50 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
21d60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21d70 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
21d80 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
21d90 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
21da0 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
21db0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
21dc0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
21dd0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
21de0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
21df0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
21e00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21e10 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
21e20 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
21e30 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
21e40 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
21e50 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
21e60 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
21e70 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
21e80 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
21e90 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
21ea0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
21eb0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
21ec0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
21ed0 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
21ee0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
21ef0 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
21f00 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
21f10 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
21f20 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
21f30 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
21f40 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
21f50 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
21f60 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
21f70 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
21f80 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
21f90 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
21fa0 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
21fb0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
21fc0 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
21fd0 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
21fe0 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
21ff0 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
22000 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
22010 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
22020 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
22030 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
22040 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
22050 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
22060 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
22070 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
22080 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
22090 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
220a0 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
220b0 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
220c0 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
220d0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
220e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
220f0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
22100 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
22110 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
22120 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22130 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
22140 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
22150 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d  }..  v = pPKey2-
22160 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
22170 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
22180 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
22190 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
221a0 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
221b0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
221c0 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
221d0 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
221e0 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
221f0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
22200 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
22210 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
22220 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
22230 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
22240 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
22250 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
22260 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
22270 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
22280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
22290 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
222a0 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
222b0 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68  are equal and th
222c0 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c  ere are no trail
222d0 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ing.    ** field
222e0 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32  s. Return pPKey2
222f0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20  ->default_rc in 
22300 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20  this case. */.  
22310 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22320 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
22330 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
22340 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   1;.  }..  asser
22350 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
22360 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
22370 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
22380 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  res) );.  return
22390 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   res;.}../*.** T
223a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
223b0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
223c0 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
223d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
223e0 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
223f0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
22400 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73  of pPKey2 is a s
22410 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20  tring, that (b) 
22420 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
22430 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ** uses the coll
22440 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
22450 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68  INARY and (c) th
22460 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
22470 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a  eader varint .**
22480 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
22490 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
224a0 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
224b0 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
224c0 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
224d0 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69  mpareString(.  i
224e0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
224f0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
22500 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
22510 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
22520 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
22530 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
22540 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
22550 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
22560 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
22570 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
22580 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  s;..  assert( pP
22590 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c  Key2->aMem[0].fl
225a0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
225b0 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
225c0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
225d0 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
225e0 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
225f0 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  fo);.  getVarint
22600 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
22610 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
22620 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
22630 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
22640 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
22650 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
22660 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
22670 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
22680 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
22690 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
226a0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
226b0 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
226c0 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
226d0 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
226e0 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
226f0 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
22700 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
22710 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
22720 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
22730 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
22740 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
22750 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
22760 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
22770 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
22780 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22790 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
227a0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
227b0 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d      }.    nCmp =
227c0 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d   MIN( pPKey2->aM
227d0 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b  em[0].n, nStr );
227e0 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d  .    res = memcm
227f0 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c  p(&aKey1[szHdr],
22800 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
22810 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
22820 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
22830 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
22840 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
22850 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
22860 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
22870 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
22880 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
22890 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
228a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
228b0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
228c0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
228d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
228e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
228f0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
22900 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t_rc;.          
22910 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
22920 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
22930 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
22940 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s>0 ){.        r
22950 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
22960 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22970 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
22980 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a  y2->r1;.      }.
22990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
229a0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
229b0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
229c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
229d0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
229e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
229f0 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
22a00 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
22a10 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
22a20 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20  y2, res).       
22a30 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20  || CORRUPT_DB.  
22a40 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
22a50 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
22a60 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
22a70 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
22a80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22a90 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
22aa0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22ab0 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69  ompare() compati
22ac0 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ble function.** 
22ad0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  suitable for com
22ae0 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  paring serialize
22af0 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  d records to the
22b00 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
22b10 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
22b20 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
22b30 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72  .*/.RecordCompar
22b40 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  e sqlite3VdbeFin
22b50 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65  dCompare(Unpacke
22b60 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f  dRecord *p){.  /
22b70 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  * varintRecordCo
22b80 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
22b90 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
22ba0 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20  reString() both 
22bb0 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74  assume.  ** that
22bc0 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
22bd0 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20  der varint that 
22be0 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
22bf0 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f  art of each reco
22c00 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20  rd.  ** fits in 
22c10 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69  a single byte (i
22c20 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65  .e. is 127 or le
22c30 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72  ss). varintRecor
22c40 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20  dCompareInt().  
22c50 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  ** also assumes 
22c60 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
22c70 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75  to overread a bu
22c80 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74  ffer by at least
22c90 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d   the .  ** maxim
22ca0 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61  um possible lega
22cb0 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c  l header size pl
22cc0 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61  us 8 bytes. Beca
22cd0 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a  use there is.  *
22ce0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
22cf0 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28  be at least 74 (
22d00 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74  but not 136) byt
22d10 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f  es of padding fo
22d20 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a  llowing each.  *
22d30 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
22d40 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  to varintRecordC
22d50 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73  ompareInt() this
22d60 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e   makes it conven
22d70 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d  ient to.  ** lim
22d80 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
22d90 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20  he header to 64 
22da0 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77  bytes in cases w
22db0 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66  here the first f
22dc0 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20  ield.  ** is an 
22dd0 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20  integer..  **.  
22de0 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77  ** The easiest w
22df0 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ay to enforce th
22e00 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63  is limit is to c
22e10 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63  onsider only rec
22e20 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31  ords with.  ** 1
22e30 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73  3 fields or less
22e40 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66  . If the first f
22e50 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67  ield is an integ
22e60 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  er, the maximum 
22e70 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  legal.  ** heade
22e80 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20  r size is (12*5 
22e90 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20  + 1 + 1) bytes. 
22ea0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b 65   */.  if( p->pKe
22eb0 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
22ec0 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20  <=13 ){.    int 
22ed0 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b  flags = p->aMem[
22ee0 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66  0].flags;.    if
22ef0 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ( p->pKeyInfo->a
22f00 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a  SortOrder[0] ){.
22f10 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b        p->r1 = 1;
22f20 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d  .      p->r2 = -
22f30 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
22f40 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a      p->r1 = -1;.
22f50 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b        p->r2 = 1;
22f60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
22f70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
22f80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22f90 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
22fa0 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  reInt;.    }.   
22fb0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
22fc0 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20   & MEM_Real );. 
22fd0 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
22fe0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  gs & MEM_Null );
22ff0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
23000 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
23010 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  );.    if( (flag
23020 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  s & (MEM_Real|ME
23030 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29  M_Null|MEM_Blob)
23040 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49  )==0 && p->pKeyI
23050 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30  nfo->aColl[0]==0
23060 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23070 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
23080 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r );.      retur
23090 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
230a0 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d  areString;.    }
230b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
230c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
230d0 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  Compare;.}../*.*
230e0 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
230f0 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
23100 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
23110 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
23120 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
23130 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
23140 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
23150 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
23160 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
23170 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
23180 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
23190 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
231a0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
231b0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
231c0 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
231d0 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
231e0 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
231f0 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
23200 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
23210 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
23220 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
23230 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
23240 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
23250 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
23260 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
23270 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
23280 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
23290 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
232a0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
232b0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
232c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
232d0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
232e0 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
232f0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
23300 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
23310 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
23320 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
23330 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
23340 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47  em m, v;..  /* G
23350 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
23360 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
23370 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
23380 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
23390 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
233a0 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
233b0 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
233c0 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
233d0 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
233e0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
233f0 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
23400 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
23410 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
23420 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
23430 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
23440 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
23450 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
23460 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
23470 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
23480 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
23490 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   nCellKey = sqli
234a0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
234b0 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73  ize(pCur);.  ass
234c0 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26  ert( (nCellKey &
234d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
234e0 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20  ==(u64)nCellKey 
234f0 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  );..  /* Read in
23500 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
23510 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64  ntent of the ind
23520 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71  ex entry */.  sq
23530 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
23540 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72  (&m, db, 0);.  r
23550 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
23560 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
23570 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
23580 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72  ey, &m);.  if( r
23590 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
235a0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
235b0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
235c0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
235d0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
235e0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
235f0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
23600 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
23610 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
23620 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
23630 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
23640 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
23650 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
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 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
23690 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
236a0 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
236b0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
236c0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
236d0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
236e0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
236f0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
23700 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
23710 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
23720 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
23730 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
23740 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
23750 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
23760 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
23770 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
23780 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
23790 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
237a0 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
237b0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
237c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
237d0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
237e0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
237f0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
23800 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
23810 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
23820 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
23830 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
23840 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
23850 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
23860 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
23870 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
23880 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  wid = sqlite3Sma
23890 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65  llTypeSizes[type
238a0 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61  Rowid];.  testca
238b0 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
238c0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
238d0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
238e0 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
238f0 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
23900 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
23910 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
23920 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
23930 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
23940 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
23950 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
23960 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
23970 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
23980 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
23990 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
239a0 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
239b0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
239c0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
239d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
239e0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
239f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
23a00 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
23a10 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
23a20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
23a30 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
23a40 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
23a50 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
23a60 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
23a70 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
23a80 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30  e( m.szMalloc!=0
23a90 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
23aa0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
23ab0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23ac0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
23ad0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
23ae0 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
23af0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
23b00 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
23b10 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
23b20 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
23b30 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
23b40 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
23b50 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
23b60 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
23b70 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
23b80 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
23b90 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
23ba0 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
23bb0 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
23bc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23bd0 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
23be0 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
23bf0 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
23c00 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
23c10 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
23c20 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
23c30 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
23c40 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
23c50 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
23c60 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
23c70 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
23c80 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
23c90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
23ca0 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
23cb0 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
23cc0 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
23cd0 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
23ce0 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
23cf0 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
23d00 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
23d10 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
23d20 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
23d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
23d40 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
23d50 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  n */.  VdbeCurso
23d60 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
23d70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
23d80 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
23d90 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
23da0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
23db0 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
23dc0 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
23dd0 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
23de0 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e00 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
23e10 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
23e20 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
23e30 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
23e40 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
23e50 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20  or *pCur;.  Mem 
23e60 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  m;..  assert( pC
23e70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
23e80 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
23e90 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  Cur = pC->uc.pCu
23ea0 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rsor;.  assert( 
23eb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23ec0 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
23ed0 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20  );.  nCellKey = 
23ee0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
23ef0 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20  oadSize(pCur);. 
23f00 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
23f10 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
23f20 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
23f30 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
23f40 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61  the way.  ** tha
23f50 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
23f60 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
23f70 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
23f80 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
23f90 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
23fa0 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
23fb0 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
23fc0 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
23fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23fe0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
23ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
24000 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
24010 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
24020 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
24030 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
24040 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69  ellKey, &m);.  i
24050 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
24060 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72  urn rc;.  }.  *r
24070 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
24080 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
24090 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  hSkip(m.n, m.z, 
240a0 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20  pUnpacked, 0);. 
240b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
240c0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
240d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
240e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
240f0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
24100 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
24110 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
24120 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
24130 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
24140 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
24150 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
24160 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
24170 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
24180 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
24190 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
241a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
241b0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
241c0 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
241d0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
241e0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
241f0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
24200 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
24210 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
24220 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
24230 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
24240 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
24250 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
24260 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
24270 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
24280 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
24290 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
242a0 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
242b0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
242c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
242d0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
242e0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
242f0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
24300 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
24310 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
24320 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
24330 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
24340 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
24350 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
24360 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
24370 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
24380 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
24390 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
243a0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
243b0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
243c0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
243d0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
243e0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
243f0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
24400 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
24410 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
24420 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
24430 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a  s obsolete..**.*
24440 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c  * If iCode is 1,
24450 20 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e   then expiration
24460 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
24470 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f  he statement sho
24480 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70  uld.** be reprep
24490 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
244a0 67 20 72 65 73 74 61 72 74 65 64 2c 20 62 75 74  g restarted, but
244b0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
244c0 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20  y running.** it 
244d0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75  is allowed to ru
244e0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  n to completion.
244f0 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c  .**.** Internall
24500 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
24510 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 56   just sets the V
24520 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67  dbe.expired flag
24530 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61   on all.** prepa
24540 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  red statements. 
24550 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65 74   The flag is set
24560 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d   to 1 for an imm
24570 65 64 69 61 74 65 20 65 78 70 69 72 61 74 69 6f  ediate expiratio
24580 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20  n.** and set to 
24590 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72  2 for an advisor
245a0 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f  y expiration..*/
245b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
245c0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
245d0 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
245e0 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20  b, int iCode){. 
245f0 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
24600 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
24610 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
24620 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
24630 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a  iCode+1;.  }.}..
24640 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24650 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
24660 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
24670 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
24680 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
24690 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
246a0 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
246b0 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49   Return the SQLI
246c0 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73  TE_PREPARE flags
246d0 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a   for a Vdbe..*/.
246e0 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  u8 sqlite3VdbePr
246f0 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65 20  epareFlags(Vdbe 
24700 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
24710 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f  >prepFlags;.}../
24720 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
24730 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
24740 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
24750 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
24760 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
24770 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
24780 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
24790 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
247a0 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
247b0 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
247c0 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
247d0 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
247e0 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
247f0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
24800 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
24810 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
24820 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
24830 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
24840 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
24850 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
24860 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
24870 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
24880 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
24890 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
248a0 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
248b0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
248c0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
248d0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
248e0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
248f0 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
24900 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61  r[iVar-1];.    a
24910 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66  ssert( (v->db->f
24920 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
24930 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a  ableQPSG)==0 );.
24940 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
24950 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
24960 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
24970 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
24980 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
24990 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
249a0 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
249b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
249c0 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
249d0 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
249e0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
249f0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
24a00 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
24a10 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  UTF8);.      }. 
24a20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
24a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24a40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
24a50 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
24a60 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
24a70 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
24a80 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
24a90 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
24aa0 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
24ab0 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
24ac0 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
24ad0 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
24ae0 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
24af0 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
24b00 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
24b10 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
24b20 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
24b30 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
24b40 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
24b50 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
24b60 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
24b70 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20  .  if( iVar>=32 
24b80 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
24b90 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b  k |= 0x80000000;
24ba0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
24bb0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
24bc0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
24bd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
24be0 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  ause a function 
24bf0 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  to throw an erro
24c00 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c  r if it was call
24c10 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e   from OP_PureFun
24c20 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  c.** rather than
24c30 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OP_Function..**
24c40 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20  .** OP_PureFunc 
24c50 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
24c60 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
24c70 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61  deterministic, a
24c80 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72  nd should.** thr
24c90 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
24ca0 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74  t is given input
24cb0 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  s that would mak
24cc0 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  e it non-determi
24cd0 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20  nistic..** This 
24ce0 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
24cf0 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20  ed by date/time 
24d00 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
24d10 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  se non-determini
24d20 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73  stic.** features
24d30 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a   such as 'now'..
24d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  */.int sqlite3No
24d50 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65  tPureFunc(sqlite
24d60 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
24d70 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
24d80 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
24d90 53 54 41 54 34 0a 20 20 69 66 28 20 70 43 74 78  STAT4.  if( pCtx
24da0 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74  ->pVdbe==0 ) ret
24db0 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 1;.#endif.  
24dc0 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d  if( pCtx->pVdbe-
24dd0 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e  >aOp[pCtx->iOp].
24de0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46  opcode==OP_PureF
24df0 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
24e00 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
24e10 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e  pCtx, .       "n
24e20 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
24e30 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64   function in ind
24e40 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  ex expression or
24e50 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
24e60 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a  t",.       -1);.
24e70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
24e80 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
24e90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24ea0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
24eb0 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
24ec0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
24ed0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
24ee0 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
24ef0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
24f00 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
24f10 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
24f20 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
24f30 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
24f40 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
24f50 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
24f60 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
24f70 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
24f80 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
24f90 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
24fa0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
24fb0 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
24fc0 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
24fd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24fe0 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
24ff0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25000 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
25010 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
25020 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
25030 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
25040 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25050 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
25060 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
25070 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
25080 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
25090 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
250a0 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
250b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
250c0 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
250d0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
250e0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
250f0 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
25100 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
25110 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
25120 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
25130 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
25140 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
25150 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
25160 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
25170 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
25180 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
25190 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
251a0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
251b0 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
251c0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
251d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
251e0 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
251f0 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
25200 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
25210 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
25220 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
25230 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
25240 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55  b, int nField, U
25250 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
25260 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
25270 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
25280 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
25290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20  i++){.      Mem 
252a0 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
252b0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
252c0 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73  Mem->zMalloc ) s
252d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
252e0 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
252f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
25300 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
25310 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
25320 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
25330 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
25340 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
25350 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
25360 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
25370 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
25380 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
25390 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
253a0 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
253b0 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
253c0 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
253d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
253e0 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
253f0 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
25400 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
25410 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
25420 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
25430 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
25440 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
25450 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
25460 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
25470 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
25480 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
25490 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
254a0 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
254b0 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
254e0 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
254f0 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
25500 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
25510 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
25520 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
25530 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
25540 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
25550 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
25560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25570 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
25580 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
25590 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
255a0 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
255b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
255c0 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
255d0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
255e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
255f0 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
25600 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25620 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
25630 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
25640 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
25650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25660 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
25670 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
25680 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
25690 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
256a0 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
256b0 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
256c0 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
256d0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
256e0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
256f0 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
25700 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
25710 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
25720 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
25730 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
25740 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
25750 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
25760 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31  ==0 ){.    iKey1
25770 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20   = iKey2 = 0;.  
25780 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20    preupdate.pPk 
25790 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
257a0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
257b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
257c0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
257d0 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  TE ){.      iKey
257e0 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
257f0 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ].u.i;.    }else
25800 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
25810 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  iKey1;.    }.  }
25820 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
25830 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
25840 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
25850 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
25860 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
25870 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
25880 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
25890 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
258a0 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
258b0 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
258c0 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
258d0 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
258e0 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
258f0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
25900 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
25910 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
25920 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
25930 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
25940 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d  info.nKeyField =
25950 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70   pTab->nCol;.  p
25960 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
25970 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  .aSortOrder = (u
25980 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65  8*)&fakeSortOrde
25990 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  r;.  preupdate.i
259a0 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key1 = iKey1;.  
259b0 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20  preupdate.iKey2 
259c0 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70  = iKey2;.  preup
259d0 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62  date.pTab = pTab
259e0 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  ;..  db->pPreUpd
259f0 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65  ate = &preupdate
25a00 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
25a10 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
25a20 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62  PreUpdateArg, db
25a30 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  , op, zDb, zTbl,
25a40 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a   iKey1, iKey2);.
25a50 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
25a60 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
25a70 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
25a80 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20  ate.aRecord);.  
25a90 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
25aa0 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b  (db, preupdate.k
25ab0 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64  eyinfo.nKeyField
25ac0 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55  +1, preupdate.pU
25ad0 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65  npacked);.  vdbe
25ae0 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
25af0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
25b00 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20  fo.nKeyField+1, 
25b10 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e  preupdate.pNewUn
25b20 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70  packed);.  if( p
25b30 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b  reupdate.aNew ){
25b40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
25b50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
25b60 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
25b70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25b80 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75  MemRelease(&preu
25b90 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a  pdate.aNew[i]);.
25ba0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25bb0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72  3DbFreeNN(db, pr
25bc0 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20  eupdate.aNew);. 
25bd0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
25be0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
25bf0 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a     UPDATE_HOOK */.