/ Hex Artifact Content
Login

Artifact b82ca213e6b5461ef773beb76a2cfb720b301372dd4797007eb13ef6cf6f18c4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70   pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42  A->expmask;.  pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41  ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d  ->prepFlags;.  m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74  emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72  er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f  , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61  unter));.  pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f  ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20  es not grow too 
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e  large */.  if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69  New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20  _VDBE_OP] ){.   
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  (p->db);.    ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15b0: 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20    int jj, kk;.  
15c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
15d0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  = p->pParse;.   
15e0: 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a   for(jj=kk=0; jj
15f0: 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1600: 68 65 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  he; jj++){.     
1610: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1620: 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61  e *x = pParse->a
1630: 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20  ColCache + jj;. 
1640: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1650: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1660: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
1670: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
1680: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
1690: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
16a0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
16b0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
16c0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
16d0: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
16e0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
16f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1700: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
1710: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
1720: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1730: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1740: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1750: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1760: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
1770: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1780: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1790: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
17a0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
17b0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
17c0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
17d0: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
17e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
17f0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1800: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1820: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1830: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1840: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1850: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1860: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1870: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1880: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1890: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
18a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18b0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
18c0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
18d0: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
18e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
18f0: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1900: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
1910: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1920: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
1930: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
1940: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1950: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
1960: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
1970: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
1980: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
1990: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
19a0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
19b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
19c0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
19d0: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
19e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19f0: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1a00: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
1a10: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
1a20: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1a30: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
1a40: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
1a50: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
1a60: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
1a70: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
1a80: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
1a90: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
1aa0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
1ab0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
1ac0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1ad0: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1ae0: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1af0: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1b00: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1b10: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1b20: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1b30: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1b40: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1b50: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1b60: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1b70: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1b80: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1b90: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1ba0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1bb0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1bc0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1bd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  **.** If the inp
1be0: 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e  ut string does n
1bf0: 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58 22 20  ot end with "X" 
1c00: 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c  then an OP_Resul
1c10: 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e  tRow instruction
1c20: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64  .** is generated
1c30: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20   for the values 
1c40: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69  inserted..*/.voi
1c50: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c  d sqlite3VdbeMul
1c60: 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20  tiLoad(Vdbe *p, 
1c70: 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74  int iDest, const
1c80: 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e   char *zTypes, .
1c90: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1ca0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
1cb0: 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  ar c;.  va_start
1cc0: 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20  (ap, zTypes);.  
1cd0: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54  for(i=0; (c = zT
1ce0: 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  ypes[i])!=0; i++
1cf0: 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73  ){.    if( c=='s
1d00: 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ' ){.      const
1d10: 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72   char *z = va_ar
1d20: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1d30: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
1d40: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a  3VdbeAddOp4(p, z
1d50: 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20  ==0 ? OP_Null : 
1d60: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69  OP_String8, 0, i
1d70: 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29  Dest+i, 0, z, 0)
1d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d90: 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20  c=='i' ){.      
1da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db0: 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(p, OP_Integer,
1dc0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1dd0: 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20  , iDest+i);.    
1de0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
1df0: 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74  o skip_op_result
1e00: 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  row;.    }.  }. 
1e10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e20: 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(p, OP_ResultR
1e30: 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73  ow, iDest, i);.s
1e40: 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77  kip_op_resultrow
1e50: 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  :.  va_end(ap);.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1e70: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1e80: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1e90: 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a  e as a pointer..
1ea0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1eb0: 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65  beAddOp4(.  Vdbe
1ec0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1ed0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
1ee0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
1ef0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
1f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1f10: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
1f20: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
1f30: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
1f40: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f60: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
1f70: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
1f80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1f90: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
1fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
1fb0: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1fc0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74  and */.  int p4t
1fd0: 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ype          /* 
1fe0: 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20  P4 operand type 
1ff0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
2000: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2010: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
2020: 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74  p2, p3);.  sqlit
2030: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
2040: 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74  , addr, zP4, p4t
2050: 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ype);.  return a
2060: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ddr;.}../*.** Ad
2070: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
2080: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
2090: 20 76 61 6c 75 65 20 77 69 74 68 20 61 20 50 34   value with a P4
20a0: 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f  _INT64 or.** P4_
20b0: 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e  REAL type..*/.in
20c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
20d0: 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62 65 20  Op4Dup8(.  Vdbe 
20e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
20f0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
2100: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
2110: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2120: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2130: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
2140: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
2150: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
2160: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2180: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
2190: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
21a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
21b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
21c0: 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20  st u8 *zP4,     
21d0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
21e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79  nd */.  int p4ty
21f0: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  pe          /* P
2200: 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a  4 operand type *
2210: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63  /.){.  char *p4c
2220: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  opy = sqlite3DbM
2230: 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74  allocRawNN(sqlit
2240: 65 33 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b  e3VdbeDb(p), 8);
2250: 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20 29 20  .  if( p4copy ) 
2260: 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a  memcpy(p4copy, z
2270: 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e  P4, 8);.  return
2280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2290: 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p4(p, op, p1, p2
22a0: 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34  , p3, p4copy, p4
22b0: 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  type);.}../*.** 
22c0: 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53  Add an OP_ParseS
22d0: 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54  chema opcode.  T
22e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62  his routine is b
22f0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a  roken out from.*
2300: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
2310: 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e  Op4() since it n
2320: 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65  eeds to also nee
2330: 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62  ds to mark all b
2340: 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69  trees.** as havi
2350: 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a  ng been used..**
2360: 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73  .** The zWhere s
2370: 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20  tring must have 
2380: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
2390: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
23a0: 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  c()..** This rou
23b0: 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f  tine will take o
23c0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
23d0: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
23e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23f0: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
2400: 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  emaOp(Vdbe *p, i
2410: 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57  nt iDb, char *zW
2420: 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a  here){.  int j;.
2430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2440: 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op4(p, OP_ParseS
2450: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
2460: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
2470: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
2480: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
2490: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
24a0: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
24b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
24c0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
24d0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
24e0: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
24f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2500: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
2510: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
2520: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
2530: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
2540: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
2550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2560: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
2570: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
2580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
2590: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
25a0: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
25b0: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
25c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25e0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
25f0: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
2600: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
2610: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
2620: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
2630: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
2640: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
2650: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
2660: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
2670: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
2680: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
2690: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
26a0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
26b0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20   = P4_INT32;.   
26c0: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b   pOp->p4.i = p4;
26d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
26e0: 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74  dr;.}../* Insert
26f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f   the end of a co
2700: 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64  -routine.*/.void
2710: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2720: 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76  oroutine(Vdbe *v
2730: 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b  , int regYield){
2740: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2750: 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
2760: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
2770: 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20  d);..  /* Clear 
2780: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  the temporary re
2790: 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68  gister cache, th
27a0: 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74  ereby ensuring t
27b0: 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f  hat each.  ** co
27c0: 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73  -routine has its
27d0: 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74   own independent
27e0: 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72   set of register
27f0: 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f  s, because co-ro
2800: 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68  utines.  ** migh
2810: 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72  t expect their r
2820: 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70  egisters to be p
2830: 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20  reserved across 
2840: 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64  an OP_Yield, and
2850: 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64  .  ** that could
2860: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20   cause problems 
2870: 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
2880: 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  o-routines are u
2890: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
28a0: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ** temporary reg
28b0: 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d  ister..  */.  v-
28c0: 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  >pParse->nTempRe
28d0: 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72  g = 0;.  v->pPar
28e0: 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
28f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2900: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
2910: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
2920: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
2930: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
2940: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
2950: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
2960: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
2970: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
2980: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
2990: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
29a0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
29b0: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
29c0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
29d0: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
29e0: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
29f0: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
2a00: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
2a10: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
2a20: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
2a30: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
2a40: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
2a50: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
2a60: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
2a70: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
2a80: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
2a90: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
2aa0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
2ab0: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
2ac0: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
2ad0: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
2ae0: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
2af0: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
2b00: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
2b10: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
2b20: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
2b30: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
2b40: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
2b50: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
2b60: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
2b70: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
2b80: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  akeLabel(Vdbe *v
2b90: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  ){.  Parse *p = 
2ba0: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  v->pParse;.  int
2bb0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
2bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d  ;.  assert( v->m
2bd0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2be0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28  _INIT );.  if( (
2bf0: 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b  i & (i-1))==0 ){
2c00: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  .    p->aLabel =
2c10: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
2c20: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
2c30: 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20  ->aLabel, .     
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66    (i*2+1)*sizeof
2c70: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b  (p->aLabel[0]));
2c80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c  .  }.  if( p->aL
2c90: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
2ca0: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20  Label[i] = -1;. 
2cb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52   }.  return ADDR
2cc0: 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (i);.}../*.** Re
2cd0: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
2ce0: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
2cf0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2d00: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
2d10: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
2d20: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
2d30: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
2d40: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2d50: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
2d60: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2d70: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
2d80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2d90: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
2da0: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
2db0: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2dc0: 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28  .  int j = ADDR(
2dd0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  x);.  assert( v-
2de0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2df0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
2e00: 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  ert( j<p->nLabel
2e10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
2e20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
2e30: 4c 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66 20  Label ){.#ifdef 
2e40: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
2e50: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
2e60: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
2e70: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
2e80: 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c     printf("RESOL
2e90: 56 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25  VE LABEL %d to %
2ea0: 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29  d\n", x, v->nOp)
2eb0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2ec0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4c     assert( p->aL
2ed0: 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b  abel[j]==(-1) );
2ee0: 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20 6f   /* Labels may o
2ef0: 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64 20  nly be resolved 
2f00: 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e 61  once */.    p->a
2f10: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f  Label[j] = v->nO
2f20: 70 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66  p;.  }.}..#ifdef
2f30: 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
2f40: 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  _TEST./*.** Retu
2f50: 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f  rn TRUE if and o
2f60: 6e 6c 79 20 69 66 20 74 68 65 20 6c 61 62 65 6c  nly if the label
2f70: 20 78 20 68 61 73 20 61 6c 72 65 61 64 79 20 62   x has already b
2f80: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a  een resolved..**
2f90: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 28 7a   Return FALSE (z
2fa0: 65 72 6f 29 20 69 66 20 6c 61 62 65 6c 20 78 20  ero) if label x 
2fb0: 69 73 20 73 74 69 6c 6c 20 75 6e 72 65 73 6f 6c  is still unresol
2fc0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ved..**.** This 
2fd0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
2fe0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 74  used inside of t
2ff0: 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
3000: 2c 20 61 6e 64 20 73 6f 20 69 74 0a 2a 2a 20 6f  , and so it.** o
3010: 6e 6c 79 20 65 78 69 73 74 73 20 77 68 65 6e 20  nly exists when 
3020: 6d 65 61 73 75 72 69 6e 67 20 74 65 73 74 20 63  measuring test c
3030: 6f 76 65 72 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  overage..*/.int 
3040: 73 71 6c 69 74 65 33 56 64 62 65 4c 61 62 65 6c  sqlite3VdbeLabel
3050: 48 61 73 42 65 65 6e 52 65 73 6f 6c 76 65 64 28  HasBeenResolved(
3060: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b  Vdbe *v, int x){
3070: 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 70 50 61  .  return v->pPa
3080: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 26 26 20 76  rse->aLabel && v
3090: 2d 3e 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  ->pParse->aLabel
30a0: 5b 41 44 44 52 28 78 29 5d 3e 3d 30 3b 0a 7d 0a  [ADDR(x)]>=0;.}.
30b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
30c0: 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a  _COVERAGE_TEST *
30d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68  /../*.** Mark th
30e0: 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68  e VDBE as one th
30f0: 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72  at can only be r
3100: 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a  un one time..*/.
3110: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3120: 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65  RunOnlyOnce(Vdbe
3130: 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e   *p){.  p->runOn
3140: 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  lyOnce = 1;.}../
3150: 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44  *.** Mark the VD
3160: 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63  BE as one that c
3170: 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d  an only be run m
3180: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a  ultiple times..*
3190: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
31a0: 62 65 52 65 75 73 61 62 6c 65 28 56 64 62 65 20  beReusable(Vdbe 
31b0: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
31c0: 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69  yOnce = 0;.}..#i
31d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
31e0: 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65  G /* sqlite3Asse
31f0: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67  rtMayAbort() log
3200: 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ic */../*.** The
3210: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
3220: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  and function are
3230: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
3240: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
3250: 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62  odes.** in a Vdb
3260: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
3270: 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73  nd each of the s
3280: 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69  ub-programs (tri
3290: 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a  ggers) it may .*
32a0: 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c  * invoke directl
32b0: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e  y or indirectly.
32c0: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73   It should be us
32d0: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
32e0: 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  *.**   Op *pOp;.
32f0: 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20  **   VdbeOpIter 
3300: 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d  sIter;.**.**   m
3310: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
3320: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
3330: 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20  .**   sIter.v = 
3340: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
3360: 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64   v is of type Vd
3370: 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28  be* .**   while(
3380: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
3390: 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a  xt(&sIter)) ){.*
33a0: 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65  *     // Do some
33b0: 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a  thing with pOp.*
33c0: 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74  *   }.**   sqlit
33d0: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
33e0: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a  sIter.apSub);.**
33f0: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
3400: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56  uct VdbeOpIter V
3410: 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63  dbeOpIter;.struc
3420: 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20  t VdbeOpIter {. 
3430: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
3440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
3450: 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  dbe to iterate t
3460: 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64  hrough the opcod
3470: 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72  es of */.  SubPr
3480: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20  ogram **apSub;  
3490: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
34a0: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  f subprograms */
34b0: 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20  .  int nSub;    
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34d0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
34e0: 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20  es in apSub */. 
34f0: 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20   int iAddr;     
3500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3510: 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69  ddress of next i
3520: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65  nstruction to re
3530: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  turn */.  int iS
3540: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
3550: 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e       /* 0 = main
3560: 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69   program, 1 = fi
3570: 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  rst sub-program 
3580: 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  etc. */.};.stati
3590: 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74  c Op *opIterNext
35a0: 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b  (VdbeOpIter *p){
35b0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
35c0: 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20  v;.  Op *pRet = 
35d0: 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20  0;.  Op *aOp;.  
35e0: 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20  int nOp;..  if( 
35f0: 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62  p->iSub<=p->nSub
3600: 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   ){..    if( p->
3610: 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iSub==0 ){.     
3620: 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20   aOp = v->aOp;. 
3630: 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f       nOp = v->nO
3640: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
3650: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53      aOp = p->apS
3660: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61  ub[p->iSub-1]->a
3670: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
3680: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
3690: 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  -1]->nOp;.    }.
36a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
36b0: 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20  Addr<nOp );..   
36c0: 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e   pRet = &aOp[p->
36d0: 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69  iAddr];.    p->i
36e0: 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Addr++;.    if( 
36f0: 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b  p->iAddr==nOp ){
3700: 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b  .      p->iSub++
3710: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72  ;.      p->iAddr
3720: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
3730: 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74     if( pRet->p4t
3740: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
3750: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
3760: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62  nByte = (p->nSub
3770: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
3780: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69  ogram*);.      i
3790: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
37a0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20  j=0; j<p->nSub; 
37b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
37c0: 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70  ( p->apSub[j]==p
37d0: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
37e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
37f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
3800: 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->nSub ){.      
3810: 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c    p->apSub = sql
3820: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
3830: 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70  ree(v->db, p->ap
3840: 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Sub, nByte);.   
3850: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53       if( !p->apS
3860: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
3870: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
3880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3890: 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e     p->apSub[p->n
38a0: 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70  Sub++] = pRet->p
38b0: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
38c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
38d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
38e0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
38f0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72   Check if the pr
3900: 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
3910: 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65  the VM associate
3920: 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61  d with pParse ma
3930: 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
3940: 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63  ORT exception (c
3950: 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65  ausing the state
3960: 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e  ment, but not en
3970: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
3980: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
3990: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
39a0: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
39b0: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
39c0: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
39d0: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
39e0: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
39f0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
3a00: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
3a10: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
3a20: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
3a30: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
3a40: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
3a50: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
3a60: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
3a70: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
3a80: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
3a90: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
3aa0: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
3ab0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
3ac0: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
3ad0: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
3ae0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
3af0: 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43  nt).**   *  OP_C
3b00: 72 65 61 74 65 42 74 72 65 65 2f 42 54 52 45 45  reateBtree/BTREE
3b10: 5f 49 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49  _INTKEY and OP_I
3b20: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a  nitCoroutine .**
3b30: 20 20 20 20 20 20 28 66 6f 72 20 43 52 45 41 54        (for CREAT
3b40: 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43  E TABLE AS SELEC
3b50: 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  T ...).**.** The
3b60: 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  n check that the
3b70: 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e   value of Parse.
3b80: 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65  mayAbort is true
3b90: 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20   if an.** ABORT 
3ba0: 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f  may be thrown, o
3bb0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
3bc0: 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  e. Return true i
3bd0: 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74  f it does.** mat
3be0: 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  ch, or false oth
3bf0: 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e  erwise. This fun
3c00: 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65  ction is intende
3c10: 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a  d to be used as.
3c20: 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  ** part of an as
3c30: 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69  sert statement i
3c40: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  n the compiler. 
3c50: 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a  Similar to:.**.*
3c60: 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  *   assert( sqli
3c70: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
3c80: 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56  Abort(pParse->pV
3c90: 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  dbe, pParse->may
3ca0: 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74  Abort) );.*/.int
3cb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
3cc0: 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20  rtMayAbort(Vdbe 
3cd0: 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74  *v, int mayAbort
3ce0: 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72  ){.  int hasAbor
3cf0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  t = 0;.  int has
3d00: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20  FkCounter = 0;. 
3d10: 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61   int hasCreateTa
3d20: 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ble = 0;.  int h
3d30: 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  asInitCoroutine 
3d40: 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  = 0;.  Op *pOp;.
3d50: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74    VdbeOpIter sIt
3d60: 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49  er;.  memset(&sI
3d70: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
3d80: 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e  Iter));.  sIter.
3d90: 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28  v = v;..  while(
3da0: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
3db0: 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29  xt(&sIter))!=0 )
3dc0: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65  {.    int opcode
3dd0: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
3de0: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
3df0: 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70  OP_Destroy || op
3e00: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
3e10: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
3e20: 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20  Rename .     || 
3e30: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ((opcode==OP_Hal
3e40: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  t || opcode==OP_
3e50: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20  HaltIfNull) .   
3e60: 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26     && ((pOp->p1&
3e70: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
3e80: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
3e90: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a  >p2==OE_Abort)).
3ea0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73      ){.      has
3eb0: 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  Abort = 1;.     
3ec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3ed0: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
3ee0: 5f 43 72 65 61 74 65 42 74 72 65 65 20 26 26 20  _CreateBtree && 
3ef0: 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49  pOp->p3==BTREE_I
3f00: 4e 54 4b 45 59 20 29 20 68 61 73 43 72 65 61 74  NTKEY ) hasCreat
3f10: 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  eTable = 1;.    
3f20: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  if( opcode==OP_I
3f30: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68  nitCoroutine ) h
3f40: 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  asInitCoroutine 
3f50: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
3f60: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
3f70: 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63  _KEY.    if( opc
3f80: 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65  ode==OP_FkCounte
3f90: 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20  r && pOp->p1==0 
3fa0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b  && pOp->p2==1 ){
3fb0: 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e  .      hasFkCoun
3fc0: 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ter = 1;.    }.#
3fd0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
3fe0: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
3ff0: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
4000: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
4010: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
4020: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
4030: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
4040: 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66  ccurred..  ** If
4050: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
4060: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
4070: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
4080: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
4090: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
40a0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
40b0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
40c0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
40d0: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
40e0: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
40f0: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
4100: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
4110: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
4120: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
4130: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
4140: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4150: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
4160: 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b  ayAbort || hasFk
4170: 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20  Counter.        
4180: 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65        || (hasCre
4190: 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49  ateTable && hasI
41a0: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b  nitCoroutine) );
41b0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
41c0: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
41d0: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
41e0: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
41f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
4200: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4210: 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  d after all opco
4220: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
4230: 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70  serted.  It loop
4240: 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c  s.** through all
4250: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64   the opcodes and
4260: 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64   fixes up some d
4270: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  etails..**.** (1
4280: 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20  ) For each jump 
4290: 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68  instruction with
42a0: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
42b0: 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a  alue (a label).*
42c0: 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68  *     resolve th
42d0: 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e  e P2 value to an
42e0: 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e   actual address.
42f0: 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75  .**.** (2) Compu
4300: 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  te the maximum n
4310: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4320: 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53  ts used by any S
4330: 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20  QL function.**  
4340: 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61     and store tha
4350: 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78  t value in *pMax
4360: 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20  FuncArgs..**.** 
4370: 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56  (3) Update the V
4380: 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64  dbe.readOnly and
4390: 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20   Vdbe.bIsReader 
43a0: 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74  flags to accurat
43b0: 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63  ely.**     indic
43c0: 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65  ate what the pre
43d0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
43e0: 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a  actually does..*
43f0: 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c  *.** (4) Initial
4400: 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61  ize the p4.xAdva
4410: 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f  nce pointer on o
4420: 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20  pcodes that use 
4430: 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65  it..**.** (5) Re
4440: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
4450: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73   allocated for s
4460: 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a  toring labels..*
4470: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4480: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63  e will only func
4490: 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20 69  tion correctly i
44a0: 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  f the mkopcodeh.
44b0: 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  tcl generator.**
44c0: 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73 20   script numbers 
44d0: 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72 72  the opcodes corr
44e0: 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73 20  ectly.  Changes 
44f0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
4500: 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64  must be.** coord
4510: 69 6e 61 74 65 64 20 77 69 74 68 20 63 68 61 6e  inated with chan
4520: 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68  ges to mkopcodeh
4530: 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  .tcl..*/.static 
4540: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
4550: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
4560: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
4570: 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  {.  int nMaxArgs
4580: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
4590: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50  ;.  Op *pOp;.  P
45a0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
45b0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
45c0: 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65  *aLabel = pParse
45d0: 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72  ->aLabel;.  p->r
45e0: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70  eadOnly = 1;.  p
45f0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b  ->bIsReader = 0;
4600: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
4610: 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68  [p->nOp-1];.  wh
4620: 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20  ile(1){..    /* 
4630: 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65  Only JUMP opcode
4640: 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74 20  s and the short 
4650: 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c 20  list of special 
4660: 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73  opcodes in the s
4670: 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c  witch.    ** bel
4680: 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ow need to be co
4690: 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65 20 6d  nsidered.  The m
46a0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e  kopcodeh.tcl gen
46b0: 65 72 61 74 6f 72 20 73 63 72 69 70 74 20 67 72  erator script gr
46c0: 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  oups.    ** all 
46d0: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74 6f  these opcodes to
46e0: 67 65 74 68 65 72 20 6e 65 61 72 20 74 68 65 20  gether near the 
46f0: 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70 63  front of the opc
4700: 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a  ode list.  Skip.
4710: 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64      ** any opcod
4720: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
4730: 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67 20  need processing 
4740: 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74 68  by virtual of th
4750: 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20  e fact that.    
4760: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
4770: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
4780: 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61  UMP_OPCODE, as a
4790: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
47a0: 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  imization..    *
47b0: 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  /.    if( pOp->o
47c0: 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58  pcode<=SQLITE_MX
47d0: 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a  _JUMP_OPCODE ){.
47e0: 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42        /* NOTE: B
47f0: 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65  e sure to update
4800: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77   mkopcodeh.tcl w
4810: 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65  hen adding or re
4820: 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  moving.      ** 
4830: 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20  cases from this 
4840: 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 20  switch! */.     
4850: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
4860: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
4870: 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74  case OP_Transact
4880: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ion: {.         
4890: 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20   if( pOp->p2!=0 
48a0: 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ) p->readOnly = 
48b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;.          /* 
48c0: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
48d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
48e0: 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  ase OP_AutoCommi
48f0: 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  t:.        case 
4900: 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a  OP_Savepoint: {.
4910: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73            p->bIs
4920: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Reader = 1;.    
4930: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4940: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
4950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
4960: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43         case OP_C
4970: 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69  heckpoint:.#endi
4980: 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  f.        case O
4990: 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20  P_Vacuum:.      
49a0: 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61    case OP_Journa
49b0: 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  lMode: {.       
49c0: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
49d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   0;.          p-
49e0: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a  >bIsReader = 1;.
49f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4a00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4a10: 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a     case OP_Next:
4a20: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4a30: 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20  _NextIfOpen:.   
4a40: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72       case OP_Sor
4a50: 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20  terNext: {.     
4a60: 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64       pOp->p4.xAd
4a70: 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42  vance = sqlite3B
4a80: 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20  treeNext;.      
4a90: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
4aa0: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
4ab0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
4ac0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65  ode generator ne
4ad0: 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66  ver codes any of
4ae0: 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61   these opcodes a
4af0: 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20  s a jump.       
4b00: 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c     ** to a label
4b10: 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 61  .  They are alwa
4b20: 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75  ys coded as a ju
4b30: 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20  mp backwards to 
4b40: 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  a .          ** 
4b50: 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f  known address */
4b60: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
4b70: 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b  t( pOp->p2>=0 );
4b80: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4b90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4ba0: 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76      case OP_Prev
4bb0: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4bc0: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
4bd0: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
4be0: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
4bf0: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
4c00: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  s;.          pOp
4c10: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
4c20: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20  VANCE;.         
4c30: 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e   /* The code gen
4c40: 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64  erator never cod
4c50: 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  es any of these 
4c60: 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d  opcodes as a jum
4c70: 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  p.          ** t
4c80: 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79  o a label.  They
4c90: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65   are always code
4ca0: 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b  d as a jump back
4cb0: 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20  wards to a .    
4cc0: 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61        ** known a
4cd0: 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ddress */.      
4ce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
4cf0: 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  >p2>=0 );.      
4d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4d10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
4d20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
4d30: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61  TABLE.        ca
4d40: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
4d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
4d60: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
4d70: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
4d80: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
4d90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4da0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4db0: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
4dc0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
4dd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
4de0: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d  pOp - p->aOp) >=
4df0: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3 );.          
4e00: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
4e10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
4e20: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er );.          
4e30: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
4e40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e            if( n>
4e50: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
4e60: 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  rgs = n;.       
4e70: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
4e80: 67 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61  gh into the defa
4e90: 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ult case */.    
4ea0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4eb0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
4ec0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
4ed0: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
4ee0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b         /* The mk
4ef0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69  opcodeh.tcl scri
4f00: 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67  pt has so arrang
4f10: 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74  ed things that t
4f20: 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  he only.        
4f30: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
4f40: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
4f50: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
4f60: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
4f70: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  teed to.        
4f80: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
4f90: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
4fa0: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
4fb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
4fc0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
4fd0: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
4fe0: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
4ff0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
5000: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28     assert( ADDR(
5010: 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d  pOp->p2)<pParse-
5020: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
5030: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
5040: 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70   aLabel[ADDR(pOp
5050: 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20 20  ->p2)];.        
5060: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
5070: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
5090: 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63  The mkopcodeh.tc
50a0: 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20  l script has so 
50b0: 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20  arranged things 
50c0: 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20  that the only.  
50d0: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
50e0: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
50f0: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5100: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
5110: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  teed to.      **
5120: 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69   have non-negati
5130: 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32  ve values for P2
5140: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
5150: 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  t( (sqlite3Opcod
5160: 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f  eProperty[pOp->o
5170: 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d  pcode]&OPFLG_JUM
5180: 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32  P)==0 || pOp->p2
5190: 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >=0);.    }.    
51a0: 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20  if( pOp==p->aOp 
51b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70  ) break;.    pOp
51c0: 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  --;.  }.  sqlite
51d0: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
51e0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a  Parse->aLabel);.
51f0: 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c    pParse->aLabel
5200: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
5210: 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70  nLabel = 0;.  *p
5220: 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d  MaxFuncArgs = nM
5230: 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74  axArgs;.  assert
5240: 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d  ( p->bIsReader!=
5250: 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65  0 || DbMaskAllZe
5260: 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  ro(p->btreeMask)
5270: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
5280: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
5290: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
52a0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
52b0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
52c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
52d0: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
52e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
52f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5300: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
5310: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
5320: 20 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20   Verify that at 
5330: 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73  least N opcode s
5340: 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62  lots are availab
5350: 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a  le in p without.
5360: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c  ** having to mal
5370: 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61  loc for more spa
5380: 63 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20  ce (except when 
5390: 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a  compiled using.*
53a0: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  * SQLITE_TEST_RE
53b0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20  ALLOC_STRESS).  
53c0: 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69  This interface i
53d0: 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
53e0: 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69  sting.** to veri
53f0: 66 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  fy that certain 
5400: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
5410: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20  VdbeAddOpList() 
5420: 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69  can never.** fai
5430: 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66  l due to a OOM f
5440: 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74  ault and hence t
5450: 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76  hat the return v
5460: 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  alue from.** sql
5470: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
5480: 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  t() will always 
5490: 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a  be non-NULL..*/.
54a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
54b0: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
54c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
54d0: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
54e0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
54f0: 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63  beVerifyNoMalloc
5500: 52 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70  Required(Vdbe *p
5510: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
5520: 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c  rt( p->nOp + N <
5530: 3d 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  = p->pParse->nOp
5540: 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69  Alloc );.}.#endi
5550: 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  f../*.** Verify 
5560: 74 68 61 74 20 74 68 65 20 56 4d 20 70 61 73 73  that the VM pass
5570: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
5580: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
5590: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f   contain.** an O
55a0: 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
55b0: 64 65 2e 20 46 61 69 6c 20 61 6e 20 61 73 73 65  de. Fail an asse
55c0: 72 74 28 29 20 69 66 20 69 74 20 64 6f 65 73 2e  rt() if it does.
55d0: 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a   This is used.**
55e0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 72 61 67   by code in prag
55f0: 6d 61 2e 63 20 74 6f 20 65 6e 73 75 72 65 20 74  ma.c to ensure t
5600: 68 61 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  hat the implemen
5610: 74 61 74 69 6f 6e 20 6f 66 20 63 65 72 74 61 69  tation of certai
5620: 6e 0a 2a 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d  n.** pragmas com
5630: 70 6f 72 74 73 20 77 69 74 68 20 74 68 65 20 66  ports with the f
5640: 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20 69  lags specified i
5650: 6e 20 74 68 65 20 6d 6b 70 72 61 67 6d 61 74 61  n the mkpragmata
5660: 62 2e 74 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e  b.tcl.** script.
5670: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
5680: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
5690: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
56a0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
56b0: 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74  RESS).void sqlit
56c0: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65  e3VdbeVerifyNoRe
56d0: 73 75 6c 74 52 6f 77 28 56 64 62 65 20 2a 70 29  sultRow(Vdbe *p)
56e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
56f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
5700: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
5710: 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  ( p->aOp[i].opco
5720: 64 65 21 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77  de!=OP_ResultRow
5730: 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   );.  }.}.#endif
5740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5750: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
5760: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
5770: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
5780: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
5790: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
57a0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
57b0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
57c0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
57d0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
57e0: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
57f0: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
5800: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
5810: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
5820: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
5830: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
5840: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
5850: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
5860: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
5870: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
5880: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
5890: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
58a0: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
58b0: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
58c0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
58d0: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
58e0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
58f0: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
5900: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
5910: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
5920: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
5930: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
5940: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
5950: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
5960: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
5970: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
5980: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
5990: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
59a0: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
59b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
59c0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
59d0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
59e0: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
59f0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
5a00: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44  M */.  assert( D
5a10: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
5a20: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20  btreeMask) );.. 
5a30: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
5a40: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
5a50: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
5a60: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
5a70: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
5a80: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
5a90: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
5aa0: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
5ab0: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
5ac0: 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
5ad0: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f  r to the first o
5ae0: 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65  peration inserte
5af0: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72  d..**.** Non-zer
5b00: 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73 20 74  o P2 arguments t
5b10: 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  o jump instructi
5b20: 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  ons are automati
5b30: 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a  cally adjusted.*
5b40: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a 75  * so that the ju
5b50: 6d 70 20 74 61 72 67 65 74 20 69 73 20 72 65 6c  mp target is rel
5b60: 61 74 69 76 65 20 74 6f 20 74 68 65 20 66 69 72  ative to the fir
5b70: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73  st operation ins
5b80: 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70  erted..*/.VdbeOp
5b90: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 64 64   *sqlite3VdbeAdd
5ba0: 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  OpList(.  Vdbe *
5bb0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5bc0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 6f 70         /* Add op
5bd0: 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70 72 65  codes to the pre
5be0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
5bf0: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20  */.  int nOp,   
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
5c20: 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20 2a 2f  pcodes to add */
5c30: 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f  .  VdbeOpList co
5c40: 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20 20 20  nst *aOp,       
5c50: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 20 74  /* The opcodes t
5c60: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
5c70: 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20  int iLineno     
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c90: 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65  Source-file line
5ca0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74   number of first
5cb0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20   opcode */.){.  
5cc0: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
5cd0: 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a  *pOut, *pFirst;.
5ce0: 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e 30 20    assert( nOp>0 
5cf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5d00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5d10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
5d20: 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70  p->nOp + nOp > p
5d30: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
5d40: 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61  oc && growOpArra
5d50: 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20  y(p, nOp) ){.   
5d60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5d70: 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d   pFirst = pOut =
5d80: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d   &p->aOp[p->nOp]
5d90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5da0: 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20  Op; i++, aOp++, 
5db0: 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75  pOut++){.    pOu
5dc0: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d  t->opcode = aOp-
5dd0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75  >opcode;.    pOu
5de0: 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b  t->p1 = aOp->p1;
5df0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20  .    pOut->p2 = 
5e00: 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73  aOp->p2;.    ass
5e10: 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20  ert( aOp->p2>=0 
5e20: 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  );.    if( (sqli
5e30: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
5e40: 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26  y[aOp->opcode] &
5e50: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
5e60: 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a  && aOp->p2>0 ){.
5e70: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b        pOut->p2 +
5e80: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  = p->nOp;.    }.
5e90: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61      pOut->p3 = a
5ea0: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74  Op->p3;.    pOut
5eb0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
5ec0: 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d  TUSED;.    pOut-
5ed0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
5ee0: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
5ef0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5f00: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
5f10: 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  TS.    pOut->zCo
5f20: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
5f30: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
5f40: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
5f50: 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65    pOut->iSrcLine
5f60: 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65   = iLineno+i;.#e
5f70: 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c  lse.    (void)iL
5f80: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
5f90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5fa0: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  G.    if( p->db-
5fb0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5fc0: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
5fd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5fe0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
5ff0: 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b  p->nOp, &p->aOp[
6000: 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20  i+p->nOp]);.    
6010: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  }.#endif.  }.  p
6020: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
6030: 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d  return pFirst;.}
6040: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
6050: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
6060: 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a  _SCANSTATUS)./*.
6070: 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
6080: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
6090: 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64  counters managed
60a0: 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   by sqlite3_stmt
60b0: 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a  _scanstatus()..*
60c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
60d0: 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20  beScanStatus(.  
60e0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61  /* VM to add sca
6110: 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a  nstatus() to */.
6120: 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
6130: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
6140: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
6150: 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30  OP_Explain (or 0
6160: 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c  ) */.  int addrL
6170: 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
6180: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
6190: 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  s of loop counte
61a0: 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72  r */ .  int addr
61b0: 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 20 20  Visit,          
61c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
61d0: 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  ss of rows visit
61e0: 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ed counter */.  
61f0: 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20  LogEst nEst,    
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
6220: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
6230: 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ws */.  const ch
6240: 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
6250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
6260: 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  of table or inde
6270: 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  x being scanned 
6280: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
6290: 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29  e = (p->nScan+1)
62a0: 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74   * sizeof(ScanSt
62b0: 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61  atus);.  ScanSta
62c0: 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65  tus *aNew;.  aNe
62d0: 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a  w = (ScanStatus*
62e0: 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  )sqlite3DbReallo
62f0: 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61  c(p->db, p->aSca
6300: 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  n, nByte);.  if(
6310: 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61   aNew ){.    Sca
6320: 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20  nStatus *pNew = 
6330: 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b  &aNew[p->nScan++
6340: 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  ];.    pNew->add
6350: 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45  rExplain = addrE
6360: 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77  xplain;.    pNew
6370: 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64  ->addrLoop = add
6380: 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  rLoop;.    pNew-
6390: 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61 64 64  >addrVisit = add
63a0: 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77  rVisit;.    pNew
63b0: 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20  ->nEst = nEst;. 
63c0: 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d     pNew->zName =
63d0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
63e0: 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  (p->db, zName);.
63f0: 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61      p->aScan = a
6400: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  New;.  }.}.#endi
6410: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
6420: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
6430: 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c  e opcode, or P1,
6440: 20 50 32 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f   P2, P3, or P5 o
6450: 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61  perands.** for a
6460: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
6470: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
6480: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6490: 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20  Opcode(Vdbe *p, 
64a0: 75 33 32 20 61 64 64 72 2c 20 75 38 20 69 4e 65  u32 addr, u8 iNe
64b0: 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69  wOpcode){.  sqli
64c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
64d0: 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69  ddr)->opcode = i
64e0: 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69  NewOpcode;.}.voi
64f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6500: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75  ngeP1(Vdbe *p, u
6510: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
6520: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6530: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
6540: 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  1 = val;.}.void 
6550: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6560: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP2(Vdbe *p, u32
6570: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
6580: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
6590: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 32 20  tOp(p,addr)->p2 
65a0: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
65b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
65c0: 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  3(Vdbe *p, u32 a
65d0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
65e0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
65f0: 70 28 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20  p(p,addr)->p3 = 
6600: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
6610: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6620: 56 64 62 65 20 2a 70 2c 20 75 31 36 20 70 35 29  Vdbe *p, u16 p5)
6630: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
6640: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  Op>0 || p->db->m
6650: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6660: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20   if( p->nOp>0 ) 
6670: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
6680: 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 20  .p5 = p5;.}../* 
6690: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
66a0: 65 20 74 6f 20 69 4e 65 77 20 69 66 20 69 74 20  e to iNew if it 
66b0: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 69  was previously i
66c0: 4f 6c 64 20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Old */.void sqli
66d0: 74 65 33 56 64 62 65 53 77 61 70 4f 70 63 6f 64  te3VdbeSwapOpcod
66e0: 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  e(Vdbe *p, u32 a
66f0: 64 64 72 2c 20 75 38 20 69 4f 6c 64 2c 20 75 38  ddr, u8 iOld, u8
6700: 20 69 4e 65 77 29 7b 0a 20 20 56 64 62 65 4f 70   iNew){.  VdbeOp
6710: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
6720: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
6730: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
6740: 6f 64 65 3d 3d 69 4f 6c 64 20 29 20 70 4f 70 2d  ode==iOld ) pOp-
6750: 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 3b 0a  >opcode = iNew;.
6760: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
6770: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
6780: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
6790: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
67a0: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
67b0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
67c0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
67d0: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
67e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
67f0: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
6800: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
6810: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6820: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
6830: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
6840: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
6850: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
6860: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
6870: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
6880: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
6890: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
68a0: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
68b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
68c0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
68d0: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
68e0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
68f0: 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
6900: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
6910: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
6920: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
6930: 72 65 65 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b  reeNN(db, pDef);
6940: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
6950: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
6960: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
6970: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
6980: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
6990: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
69a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
69b0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
69c0: 20 66 72 65 65 50 34 4d 65 6d 28 73 71 6c 69 74   freeP4Mem(sqlit
69d0: 65 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b  e3 *db, Mem *p){
69e0: 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c  .  if( p->szMall
69f0: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
6a00: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
6a10: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
6a20: 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  reeNN(db, p);.}.
6a30: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
6a40: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65  INLINE void free
6a50: 50 34 46 75 6e 63 43 74 78 28 73 71 6c 69 74 65  P4FuncCtx(sqlite
6a60: 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 63  3 *db, sqlite3_c
6a70: 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 66 72  ontext *p){.  fr
6a80: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
6a90: 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63  ion(db, p->pFunc
6aa0: 29 3b 0a 20 73 71 6c 69 74 65 33 44 62 46 72 65  );. sqlite3DbFre
6ab0: 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74  eNN(db, p);.}.st
6ac0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34  atic void freeP4
6ad0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
6ae0: 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a  t p4type, void *
6af0: 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64  p4){.  assert( d
6b00: 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  b );.  switch( p
6b10: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
6b20: 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a  e P4_FUNCCTX: {.
6b30: 20 20 20 20 20 20 66 72 65 65 50 34 46 75 6e 63        freeP4Func
6b40: 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74 65 33  Ctx(db, (sqlite3
6b50: 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20  _context*)p4);. 
6b60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b70: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
6b80: 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  AL:.    case P4_
6b90: 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73 65 20  INT64:.    case 
6ba0: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20  P4_DYNAMIC:.    
6bb0: 63 61 73 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a  case P4_DYNBLOB:
6bc0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6bd0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
6be0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6bf0: 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61   p4);.      brea
6c00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6c10: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
6c20: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
6c30: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
6c40: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
6c50: 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34  ref((KeyInfo*)p4
6c60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6c70: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
6c80: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
6c90: 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65  R_HINTS.    case
6ca0: 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20   P4_EXPR: {.    
6cb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6cc0: 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70  ete(db, (Expr*)p
6cd0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
6ce0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
6cf0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
6d00: 46 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 45  F: {.      freeE
6d10: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
6d20: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
6d30: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
6d40: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6d50: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
6d60: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
6d70: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
6d80: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
6d90: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
6da0: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d  ue*)p4);.      }
6db0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 72  else{.        fr
6dc0: 65 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d  eeP4Mem(db, (Mem
6dd0: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  *)p4);.      }. 
6de0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6df0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  }.    case P4_VT
6e00: 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  AB : {.      if(
6e10: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
6e20: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74  d==0 ) sqlite3Vt
6e30: 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65  abUnlock((VTable
6e40: 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72   *)p4);.      br
6e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
6e60: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
6e70: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
6e80: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
6e90: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
6ea0: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
6eb0: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
6ec0: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
6ed0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
6ee0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
6ef0: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
6f00: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
6f10: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
6f20: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
6f30: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
6f40: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
6f50: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
6f60: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f  .    for(pOp=&aO
6f70: 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61  p[nOp-1]; pOp>=a
6f80: 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20  Op; pOp--){.    
6f90: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
6fa0: 65 20 3c 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f  e <= P4_FREE_IF_
6fb0: 4c 45 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  LE ) freeP4(db, 
6fc0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
6fd0: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
6fe0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
6ff0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
7000: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7010: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
7020: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
7030: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c    .    }.    sql
7040: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
7050: 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   aOp);.  }.}../*
7060: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
7070: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
7080: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
7090: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
70a0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
70b0: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
70c0: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
70d0: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
70e0: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
70f0: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
7100: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
7110: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
7120: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7130: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
7140: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
7150: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
7160: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
7170: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
7180: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
7190: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
71a0: 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f   Change the opco
71b0: 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20  de at addr into 
71c0: 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73  OP_Noop.*/.int s
71d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
71e0: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
71f0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62  int addr){.  Vdb
7200: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
7210: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7220: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
7230: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d    assert( addr>=
7240: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
7250: 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e   );.  pOp = &p->
7260: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
7270: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
7280: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
7290: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70  p);.  pOp->p4typ
72a0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
72b0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b    pOp->p4.z = 0;
72c0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
72d0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75   OP_Noop;.  retu
72e0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
72f0: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
7300: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
7310: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
7320: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
7330: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
7340: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
7350: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
7360: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
7370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7380: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
7390: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
73a0: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  8 op){.  if( p->
73b0: 6e 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b  nOp>0 && p->aOp[
73c0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
73d0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ==op ){.    retu
73e0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  rn sqlite3VdbeCh
73f0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
7400: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  >nOp-1);.  }else
7410: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
7420: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
7430: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
7440: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
7450: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
7460: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
7470: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7480: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
7490: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
74a0: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
74b0: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
74c0: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
74d0: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
74e0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
74f0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
7500: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
7510: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
7520: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
7530: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
7540: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
7550: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
7560: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
7570: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
7580: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
7590: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
75a0: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
75b0: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
75c0: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
75d0: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
75e0: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
75f0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
7600: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
7610: 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  P4..** .** Other
7620: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
7630: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
7640: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
7650: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
7660: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
7670: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
7680: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
7690: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
76a0: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
76b0: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
76c0: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
76d0: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
76e0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
76f0: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
7700: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
7710: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
7720: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
7730: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
7740: 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  d SQLITE_NOINLIN
7750: 45 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75  E vdbeChangeP4Fu
7760: 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20  ll(.  Vdbe *p,. 
7770: 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73   Op *pOp,.  cons
7780: 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69  t char *zP4,.  i
7790: 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f  nt n.){.  if( pO
77a0: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
77b0: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
77c0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
77d0: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d  >p4.p);.    pOp-
77e0: 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  >p4type = 0;.   
77f0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
7800: 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b    }.  if( n<0 ){
7810: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7820: 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74  ChangeP4(p, (int
7830: 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c  )(pOp - p->aOp),
7840: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73   zP4, n);.  }els
7850: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
7860: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
7870: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
7880: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
7890: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
78a0: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
78b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
78c0: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
78d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
78e0: 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a  eChangeP4(Vdbe *
78f0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e  p, int addr, con
7900: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e  st char *zP4, in
7910: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b  t n){.  Op *pOp;
7920: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7930: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
7940: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
7950: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
7960: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
7970: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
7980: 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62   p->aOp!=0 || db
7990: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
79a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
79b0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
79c0: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
79d0: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
79e0: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
79f0: 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  zP4);.    return
7a00: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
7a10: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
7a20: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
7a30: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
7a40: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
7a50: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
7a60: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
7a70: 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d  addr];.  if( n>=
7a80: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65  0 || pOp->p4type
7a90: 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e   ){.    vdbeChan
7aa0: 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c  geP4Full(p, pOp,
7ab0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65   zP4, n);.    re
7ac0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
7ad0: 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20  n==P4_INT32 ){. 
7ae0: 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73     /* Note: this
7af0: 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62   cast is safe, b
7b00: 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69  ecause the origi
7b10: 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73  n data point was
7b20: 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74   an int.    ** t
7b30: 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20  hat was cast to 
7b40: 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a (const char *)
7b50: 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34  . */.    pOp->p4
7b60: 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  .i = SQLITE_PTR_
7b70: 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20  TO_INT(zP4);.   
7b80: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
7b90: 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65  4_INT32;.  }else
7ba0: 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20   if( zP4!=0 ){. 
7bb0: 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29     assert( n<0 )
7bc0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
7bd0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
7be0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7bf0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
7c00: 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54      if( n==P4_VT
7c10: 41 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  AB ) sqlite3Vtab
7c20: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50  Lock((VTable*)zP
7c30: 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  4);.  }.}../*.**
7c40: 20 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 6f   Change the P4 o
7c50: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f  perand of the mo
7c60: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
7c70: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a  d instruction .*
7c80: 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 64  * to the value d
7c90: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 61 72  efined by the ar
7ca0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69  guments.  This i
7cb0: 73 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  s a high-speed.*
7cc0: 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  * version of sql
7cd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
7ce0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  ()..**.** The P4
7cf0: 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f   operand must no
7d00: 74 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76  t have been prev
7d10: 69 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e 20  iously defined. 
7d20: 20 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20   And the new.** 
7d30: 50 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 50  P4 must not be P
7d40: 34 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73 71  4_INT32.  Use sq
7d50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7d60: 34 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f 66  4() in either of
7d70: 0a 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73 2e  .** those cases.
7d80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7d90: 56 64 62 65 41 70 70 65 6e 64 50 34 28 56 64 62  VdbeAppendP4(Vdb
7da0: 65 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c  e *p, void *pP4,
7db0: 20 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f   int n){.  VdbeO
7dc0: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
7dd0: 28 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26 26  ( n!=P4_INT32 &&
7de0: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20   n!=P4_VTAB );. 
7df0: 20 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b   assert( n<=0 );
7e00: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
7e10: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
7e20: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
7e30: 6e 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65  n, pP4);.  }else
7e40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7e50: 34 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  4!=0 );.    asse
7e60: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
7e70: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
7e80: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20  p[p->nOp-1];.   
7e90: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
7ea0: 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44  type==P4_NOTUSED
7eb0: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   );.    pOp->p4t
7ec0: 79 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70  ype = n;.    pOp
7ed0: 2d 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20  ->p4.p = pP4;.  
7ee0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
7ef0: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  he P4 on the mos
7f00: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
7f10: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b   opcode to the K
7f20: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a  eyInfo for the.*
7f30: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a  * index given..*
7f40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7f50: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50  beSetP4KeyInfo(P
7f60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
7f70: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64  dex *pIdx){.  Vd
7f80: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7f90: 70 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f  pVdbe;.  KeyInfo
7fa0: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73   *pKeyInfo;.  as
7fb0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
7fc0: 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
7fd0: 29 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  );.  pKeyInfo = 
7fe0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
7ff0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
8000: 64 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  dx);.  if( pKeyI
8010: 6e 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62  nfo ) sqlite3Vdb
8020: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
8030: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
8040: 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  O);.}..#ifdef SQ
8050: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
8060: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a  AIN_COMMENTS./*.
8070: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
8080: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  mment on the mos
8090: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
80a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
80b0: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
80c0: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
80d0: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
80e0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
80f0: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
8100: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
8110: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
8120: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
8130: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
8140: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
8150: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
8160: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
8170: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
8180: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
8190: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
81a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
81b0: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
81c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
81d0: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
81e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
81f0: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
8200: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8210: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
8220: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8230: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
8240: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
8250: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
8260: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
8270: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
8280: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
8290: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
82a0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
82b0: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
82c0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
82d0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
82e0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
82f0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
8300: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
8310: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
8320: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
8330: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
8340: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
8350: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
8360: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8370: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
8380: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
8390: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
83a0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
83b0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
83c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
83d0: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
83e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
83f0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
8400: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
8410: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
8420: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
8430: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
8440: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
8450: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
8460: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
8470: 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63  alue if the iSrc
8480: 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74  Line field for t
8490: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  he previously co
84a0: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
84b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
84c0: 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65  VdbeSetLineNumbe
84d0: 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  r(Vdbe *v, int i
84e0: 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Line){.  sqlite3
84f0: 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d  VdbeGetOp(v,-1)-
8500: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
8510: 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
8520: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
8530: 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  AGE */../*.** Re
8540: 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20  turn the opcode 
8550: 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72  for a given addr
8560: 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64  ess.  If the add
8570: 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e  ress is -1, then
8580: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d  .** return the m
8590: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
85a0: 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  erted opcode..**
85b0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
85c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
85d0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72   has occurred pr
85e0: 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69  ior to the calli
85f0: 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f  ng of this.** ro
8600: 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f  utine, then a po
8610: 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79  inter to a dummy
8620: 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20   VdbeOp will be 
8630: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20  returned.  That 
8640: 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61  opcode.** is rea
8650: 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72  dable but not wr
8660: 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69  itable, though i
8670: 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77  t is cast to a w
8680: 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a  ritable value..*
8690: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20  * The return of 
86a0: 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61  a dummy opcode a
86b0: 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74  llows the call t
86c0: 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74  o continue funct
86d0: 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20  ioning.** after 
86e0: 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74  an OOM fault wit
86f0: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
8700: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
8710: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
8720: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
8730: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
8740: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
8750: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
8760: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
8770: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
8780: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
8790: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
87a0: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
87b0: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
87c0: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
87d0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
87e0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62  te3VdbeGetOp(Vdb
87f0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
8800: 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66  .  /* C89 specif
8810: 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ies that the con
8820: 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69  stant "dummy" wi
8830: 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
8840: 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65  d to all.  ** ze
8850: 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f  ros, which is co
8860: 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e  rrect.  MSVC gen
8870: 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67  erates a warning
8880: 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20  , nevertheless. 
8890: 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65  */.  static Vdbe
88a0: 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67  Op dummy;  /* Ig
88b0: 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61  nore the MSVC wa
88c0: 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69  rning about no i
88d0: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20  nitializer */.  
88e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
88f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
8900: 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  T );.  if( addr<
8910: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
8920: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
8930: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
8940: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
8950: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
8960: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
8970: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
8980: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
8990: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
89a0: 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ummy;.  }else{. 
89b0: 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f     return &p->aO
89c0: 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a  p[addr];.  }.}..
89d0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
89e0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
89f0: 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a  N_COMMENTS)./*.*
8a00: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
8a10: 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e  ger value for on
8a20: 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  e of the paramet
8a30: 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64  ers to the opcod
8a40: 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69  e pOp.** determi
8a50: 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72  ned by character
8a60: 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   c..*/.static in
8a70: 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61  t translateP(cha
8a80: 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70  r c, const Op *p
8a90: 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31  Op){.  if( c=='1
8aa0: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
8ab0: 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27  p1;.  if( c=='2'
8ac0: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
8ad0: 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20  2;.  if( c=='3' 
8ae0: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33  ) return pOp->p3
8af0: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29  ;.  if( c=='4' )
8b00: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e   return pOp->p4.
8b10: 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d  i;.  return pOp-
8b20: 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  >p5;.}../*.** Co
8b30: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66  mpute a string f
8b40: 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22  or the "comment"
8b50: 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45   field of a VDBE
8b60: 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e   opcode listing.
8b70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70  .**.** The Synop
8b80: 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f  sis: field in co
8b90: 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64  mments in the vd
8ba0: 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65  be.c source file
8bb0: 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a   gets converted.
8bc0: 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73  ** to an extra s
8bd0: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70  tring that is ap
8be0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71  pended to the sq
8bf0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8c00: 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62  ).  In the.** ab
8c10: 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63  sence of other c
8c20: 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79  omments, this sy
8c30: 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74  nopsis becomes t
8c40: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
8c50: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d  e opcode..** Som
8c60: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63  e translation oc
8c70: 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  curs:.**.**     
8c80: 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20    "PX"      ->  
8c90: 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20  "r[X]".**       
8ca0: 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72  "PX@PY"   ->  "r
8cb0: 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20  [X..X+Y-1]"  or 
8cc0: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
8cd0: 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22   or 1.**       "
8ce0: 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b  PX@PY+1" ->  "r[
8cf0: 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22  X..X+Y]"    or "
8d00: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a  r[x]" if y is 0.
8d10: 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59  **       "PY..PY
8d20: 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22  "  ->  "r[X..Y]"
8d30: 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20        or "r[x]" 
8d40: 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69  if y<=x.*/.stati
8d50: 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d  c int displayCom
8d60: 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70  ment(.  const Op
8d70: 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68   *pOp,     /* Th
8d80: 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63  e opcode to be c
8d90: 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f  ommented */.  co
8da0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
8db0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f   /* Previously o
8dc0: 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f  btained value fo
8dd0: 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a  r P4 */.  char *
8de0: 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20  zTemp,       /* 
8df0: 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72  Write result her
8e00: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70  e */.  int nTemp
8e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
8e20: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ce available in 
8e30: 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  zTemp[] */.){.  
8e40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e  const char *zOpN
8e50: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
8e60: 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20  r *zSynopsis;.  
8e70: 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69  int nOpName;.  i
8e80: 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61  nt ii, jj;.  cha
8e90: 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f  r zAlt[50];.  zO
8ea0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  pName = sqlite3O
8eb0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
8ec0: 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d  pcode);.  nOpNam
8ed0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
8ee0: 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20  n30(zOpName);.  
8ef0: 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e  if( zOpName[nOpN
8f00: 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e  ame+1] ){.    in
8f10: 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20  t seenCom = 0;. 
8f20: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a     char c;.    z
8f30: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61  Synopsis = zOpNa
8f40: 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20  me += nOpName + 
8f50: 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  1;.    if( strnc
8f60: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46  mp(zSynopsis,"IF
8f70: 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20   ",3)==0 ){.    
8f80: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
8f90: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29  SQLITE_STOREP2 )
8fa0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8fb0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
8fc0: 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22  f(zAlt), zAlt, "
8fd0: 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a  r[P2] = (%s)", z
8fe0: 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20  Synopsis+3);.   
8ff0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9000: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9010: 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c  tf(sizeof(zAlt),
9020: 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67 6f   zAlt, "if %s go
9030: 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69  to P2", zSynopsi
9040: 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s+3);.      }.  
9050: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
9060: 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zAlt;.    }.    
9070: 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c  for(ii=jj=0; jj<
9080: 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20  nTemp-1 && (c = 
9090: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d  zSynopsis[ii])!=
90a0: 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  0; ii++){.      
90b0: 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20  if( c=='P' ){.  
90c0: 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70        c = zSynop
90d0: 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20  sis[++ii];.     
90e0: 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b     if( c=='4' ){
90f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9100: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9110: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
9120: 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20  "%s", zP4);.    
9130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
9140: 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='X' ){.        
9150: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9160: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
9170: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70  mp+jj, "%s", pOp
9180: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
9190: 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d         seenCom =
91a0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
91b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
91c0: 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v1 = translateP
91d0: 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  (c, pOp);.      
91e0: 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20      int v2;.    
91f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9200: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
9210: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c   zTemp+jj, "%d",
9220: 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   v1);.          
9230: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
9240: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22  opsis+ii+1, "@P"
9250: 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 2)==0 ){.     
9260: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a         ii += 3;.
9270: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b              jj +
9280: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
9290: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
92a0: 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72           v2 = tr
92b0: 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73  anslateP(zSynops
92c0: 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20  is[ii], pOp);.  
92d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
92e0: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
92f0: 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20  ii+1,"+1",2)==0 
9300: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9310: 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   ii += 2;.      
9320: 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20          v2++;.  
9330: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9340: 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31          if( v2>1
9350: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9360: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9370: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
9380: 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76  mp+jj, "..%d", v
9390: 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20  1+v2-1);.       
93a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
93b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
93c0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
93d0: 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30  1, "..P3", 4)==0
93e0: 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29   && pOp->p3==0 )
93f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
9400: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
9410: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9420: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
9430: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
9440: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +jj);.      }els
9450: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  e{.        zTemp
9460: 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  [jj++] = c;.    
9470: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9480: 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a  ( !seenCom && jj
9490: 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d  <nTemp-5 && pOp-
94a0: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
94b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
94c0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
94d0: 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20  emp+jj, "; %s", 
94e0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
94f0: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
9500: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
9510: 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p+jj);.    }.   
9520: 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20   if( jj<nTemp ) 
9530: 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20  zTemp[jj] = 0;. 
9540: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
9550: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
9560: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9570: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
9580: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
9590: 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71  nt);.    jj = sq
95a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
95b0: 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  emp);.  }else{. 
95c0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
95d0: 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d  .    jj = 0;.  }
95e0: 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a  .  return jj;.}.
95f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9600: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56  _DEBUG */..#if V
9610: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
9620: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9630: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
9640: 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  INTS)./*.** Tran
9650: 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78  slate the P4.pEx
9660: 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20  pr value for an 
9670: 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70  OP_CursorHint op
9680: 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a  code into text.*
9690: 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69  * that can be di
96a0: 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50  splayed in the P
96b0: 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c  4 column of EXPL
96c0: 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73  AIN output..*/.s
96d0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
96e0: 61 79 50 34 45 78 70 72 28 53 74 72 41 63 63 75  ayP4Expr(StrAccu
96f0: 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78 70  m *p, Expr *pExp
9700: 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
9710: 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69   *zOp = 0;.  swi
9720: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
9730: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  {.    case TK_ST
9740: 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69  RING:.      sqli
9750: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
9760: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
9770: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
9780: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
9790: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71  NTEGER:.      sq
97a0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
97b0: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
97c0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
97d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
97e0: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c  _NULL:.      sql
97f0: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
9800: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72  NULL");.      br
9810: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9820: 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
9830: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9840: 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45  f(p, "r[%d]", pE
9850: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
9860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9870: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
9880: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
9890: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
98a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
98b0: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
98c0: 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d  rowid");.      }
98d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
98e0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
98f0: 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78 70  "c%d", (int)pExp
9900: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
9910: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9930: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70   TK_LT:      zOp
9940: 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62 72   = "LT";      br
9950: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9960: 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LE:      zOp = 
9970: 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LE";      break
9980: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
9990: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 54  :      zOp = "GT
99a0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
99b0: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20     case TK_GE:  
99c0: 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20      zOp = "GE"; 
99d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
99e0: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
99f0: 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20   zOp = "NE";    
9a00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9a10: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f  e TK_EQ:      zO
9a20: 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20 62  p = "EQ";      b
9a30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9a40: 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_IS:      zOp =
9a50: 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65 61   "IS";      brea
9a60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
9a70: 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49  SNOT:   zOp = "I
9a80: 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SNOT";   break;.
9a90: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
9aa0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22       zOp = "AND"
9ab0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9ac0: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
9ad0: 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20    zOp = "OR";   
9ae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9af0: 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a  se TK_PLUS:    z
9b00: 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 20  Op = "ADD";     
9b10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9b20: 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70 20  TK_STAR:    zOp 
9b30: 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72 65  = "MUL";     bre
9b40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9b50: 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  MINUS:   zOp = "
9b60: 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  SUB";     break;
9b70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
9b80: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d  :     zOp = "REM
9b90: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9ba0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
9bb0: 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44  :  zOp = "BITAND
9bc0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
9bd0: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
9be0: 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20  zOp = "BITOR";  
9bf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9c00: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70   TK_SLASH:   zOp
9c10: 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62 72   = "DIV";     br
9c20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9c30: 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _LSHIFT:  zOp = 
9c40: 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "LSHIFT";  break
9c50: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
9c60: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53  HIFT:  zOp = "RS
9c70: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
9c80: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
9c90: 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41  T:  zOp = "CONCA
9ca0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
9cb0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
9cc0: 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20   zOp = "MINUS"; 
9cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9ce0: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f  e TK_UPLUS:   zO
9cf0: 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20 62  p = "PLUS";    b
9d00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9d10: 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d  K_BITNOT:  zOp =
9d20: 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65 61   "BITNOT";  brea
9d30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
9d40: 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e  OT:     zOp = "N
9d50: 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OT";     break;.
9d60: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
9d70: 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55  LL:  zOp = "ISNU
9d80: 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  LL";  break;.   
9d90: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
9da0: 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c  : zOp = "NOTNULL
9db0: 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64  "; break;..    d
9dc0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71  efault:.      sq
9dd0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
9de0: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
9df0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
9e00: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
9e10: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9e20: 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b  (p, "%s(", zOp);
9e30: 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78  .    displayP4Ex
9e40: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pr(p, pExpr->pLe
9e50: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ft);.    if( pEx
9e60: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
9e70: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9e80: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 2c 22  cumAppend(p, ","
9e90: 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73 70  , 1);.      disp
9ea0: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
9eb0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9ec0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74   }.    sqlite3St
9ed0: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20  rAccumAppend(p, 
9ee0: 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23  ")", 1);.  }.}.#
9ef0: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
9f00: 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69  SPLAY_P4 && defi
9f10: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9f20: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20  E_CURSOR_HINTS) 
9f30: 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49  */...#if VDBE_DI
9f40: 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43  SPLAY_P4./*.** C
9f50: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
9f60: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
9f70: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
9f80: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
9f90: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
9fa0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
9fb0: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
9fc0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
9fd0: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
9fe0: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
9ff0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
a000: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
a010: 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d  Temp;.  StrAccum
a020: 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54   x;.  assert( nT
a030: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c  emp>=20 );.  sql
a040: 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
a050: 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e  (&x, 0, zTemp, n
a060: 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74  Temp, 0);.  swit
a070: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
a080: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
a090: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
a0a0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79  int j;.      Key
a0b0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
a0c0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
a0d0: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
a0e0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
a0f0: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
a100: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
a110: 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65  (&x, "k(%d", pKe
a120: 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
a130: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
a140: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b  ; j<pKeyInfo->nK
a150: 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20  eyField; j++){. 
a160: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
a170: 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
a180: 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  ->aColl[j];.    
a190: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a1a0: 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20  zColl = pColl ? 
a1b0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22  pColl->zName : "
a1c0: 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ";.        if( s
a1d0: 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49  trcmp(zColl, "BI
a1e0: 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c  NARY")==0 ) zCol
a1f0: 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20  l = "B";.       
a200: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
a210: 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 70 4b 65  &x, ",%s%s", pKe
a220: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
a230: 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c  r[j] ? "-" : "",
a240: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d   zColl);.      }
a250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
a260: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c  rAccumAppend(&x,
a270: 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ")", 1);.      
a280: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
a290: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a2a0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
a2b0: 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a     case P4_EXPR:
a2c0: 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79   {.      display
a2d0: 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e  P4Expr(&x, pOp->
a2e0: 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  p4.pExpr);.     
a2f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
a300: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
a310: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
a320: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
a330: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
a340: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  ;.      sqlite3X
a350: 50 72 69 6e 74 66 28 26 78 2c 20 22 28 25 2e 32  Printf(&x, "(%.2
a360: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
a370: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
a380: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a390: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
a3a0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
a3b0: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
a3c0: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
a3d0: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73  3XPrintf(&x, "%s
a3e0: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
a3f0: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
a400: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a410: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
a420: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
a430: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
a440: 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20  OFILE).    case 
a450: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
a460: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
a470: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
a480: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
a490: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
a4a0: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
a4b0: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
a4c0: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
a4d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
a4e0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
a4f0: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
a500: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
a510: 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  lld", *pOp->p4.p
a520: 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  I64);.      brea
a530: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a540: 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
a550: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
a560: 74 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70  tf(&x, "%d", pOp
a570: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
a580: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a590: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
a5a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
a5b0: 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22  intf(&x, "%.16g"
a5c0: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  , *pOp->p4.pReal
a5d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a5e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
a5f0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  4_MEM: {.      M
a600: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e  em *pMem = pOp->
a610: 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  p4.pMem;.      i
a620: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
a630: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
a640: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
a650: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
a660: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
a670: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
a680: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
a690: 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70  tf(&x, "%lld", p
a6a0: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
a6b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
a6c0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
a6d0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
a6e0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
a6f0: 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75  "%.16g", pMem->u
a700: 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
a710: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
a720: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
a730: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55         zP4 = "NU
a740: 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  LL";.      }else
a750: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a760: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
a770: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
a780: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62      zP4 = "(blob
a790: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )";.      }.    
a7a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a7b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a7c0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
a7d0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
a7e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a7f0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
a800: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
a810: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
a820: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
a830: 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29  vtab:%p", pVtab)
a840: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a850: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a860: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
a870: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
a880: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d  .      int *ai =
a890: 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20   pOp->p4.ai;.   
a8a0: 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d     int n = ai[0]
a8b0: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
a8c0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49   element of an I
a8d0: 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77 61 79  NTARRAY is alway
a8e0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
a900: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
a910: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
a920: 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20  to follow */.   
a930: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e     for(i=1; i<=n
a940: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a950: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
a960: 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29  x, ",%d", ai[i])
a970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a980: 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a  zTemp[0] = '[';.
a990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
a9a0: 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20  AccumAppend(&x, 
a9b0: 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  "]", 1);.      b
a9c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a9d0: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
a9e0: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
a9f0: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
aa00: 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
aa10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
aa20: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42 4c 4f    case P4_DYNBLO
aa30: 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41  B:.    case P4_A
aa40: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
aa50: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
aa60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aa70: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54 41 42  .    case P4_TAB
aa80: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
aa90: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
aaa0: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61  %s", pOp->p4.pTa
aab0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
aac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
aad0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
aae0: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
aaf0: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
ab00: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
ab10: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
ab20: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
ab30: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
ab40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
ab50: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29  rAccumFinish(&x)
ab60: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  ;.  assert( zP4!
ab70: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
ab80: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  P4;.}.#endif /* 
ab90: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
aba0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  */../*.** Declar
abb0: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
abc0: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
abd0: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
abe0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ] is used..**.**
abf0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
ac00: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f  atements need to
ac10: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
ac20: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   the complete se
ac30: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  t of.** attached
ac40: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
ac50: 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20  will be use.  A 
ac60: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
ac70: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
ac80: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
ac90: 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70  treeMask.  The p
aca0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65  ->lockMask value
acb0: 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f   is the subset o
acc0: 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73  f.** p->btreeMas
acd0: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74  k of databases t
ace0: 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65  hat will require
acf0: 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64   a lock..*/.void
ad00: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
ad10: 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69  Btree(Vdbe *p, i
ad20: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
ad30: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
ad40: 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29  ->nDb && i<(int)
ad50: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a  sizeof(yDbMask)*
ad60: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  8 );.  assert( i
ad70: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e  <(int)sizeof(p->
ad80: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
ad90: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62    DbMaskSet(p->b
ada0: 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  treeMask, i);.  
adb0: 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69  if( i!=1 && sqli
adc0: 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65  te3BtreeSharable
add0: 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  (p->db->aDb[i].p
ade0: 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  Bt) ){.    DbMas
adf0: 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  kSet(p->lockMask
ae00: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
ae10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ae20: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
ae30: 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  HE)./*.** If SQL
ae40: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
ae50: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
ae60: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
ae70: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
ae80: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
ae90: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
aea0: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
aeb0: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
aec0: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
aed0: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
aee0: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
aef0: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
af00: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
af10: 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74  o it also.** set
af20: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
af30: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
af40: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
af50: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
af60: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
af70: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
af80: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
af90: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
afa0: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
afb0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
afc0: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
afd0: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
afe0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
aff0: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
b000: 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76  eeEnter() is inv
b010: 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  oked to set the 
b020: 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69  BtShared.db vari
b030: 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ables.** of all 
b040: 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75  of BtShared stru
b050: 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c  ctures accessibl
b060: 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61  e via the databa
b070: 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73  se handle .** as
b080: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
b090: 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  e VM..**.** If S
b0a0: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
b0b0: 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73  eadsafe and does
b0c0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
b0d0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
b0e0: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
b0f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
b100: 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d  ** The p->btreeM
b110: 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62  ask field is a b
b120: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74  itmask of all bt
b130: 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72  rees that the pr
b140: 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65  epared .** state
b150: 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72  ment p will ever
b160: 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20   use.  Let N be 
b170: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
b180: 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ts in p->btreeMa
b190: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
b1a0: 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68  ing to btrees th
b1b0: 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61  at use shared ca
b1c0: 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72  che.  Then the r
b1d0: 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69  untime of.** thi
b1e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e  s routine is N*N
b1f0: 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72  .  But as N is r
b200: 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20  arely more than 
b210: 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  1, this should n
b220: 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c  ot.** be a probl
b230: 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
b240: 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62  te3VdbeEnter(Vdb
b250: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
b260: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b270: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
b280: 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73  nDb;.  if( DbMas
b290: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b  kAllZero(p->lock
b2a0: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20  Mask) ) return; 
b2b0: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
b2c0: 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d  ase */.  db = p-
b2d0: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
b2e0: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
b2f0: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
b300: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
b310: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
b320: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
b330: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
b340: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
b350: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b360: 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62  e3BtreeEnter(aDb
b370: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
b380: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
b390: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b3a0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
b3b0: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
b3c0: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
b3d0: 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20  * Unlock all of 
b3e0: 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69  the btrees previ
b3f0: 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20  ously locked by 
b400: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
b410: 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f  3VdbeEnter()..*/
b420: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
b430: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62  OINLINE void vdb
b440: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
b450: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
b460: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
b470: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
b480: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
b490: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
b4a0: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
b4b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
b4c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
b4d0: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
b4e0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
b4f0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
b500: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
b510: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
b520: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29  eave(aDb[i].pBt)
b530: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f  ;.    }.  }.}.vo
b540: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65  id sqlite3VdbeLe
b550: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
b560: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
b570: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
b580: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
b590: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
b5a0: 20 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a    vdbeLeave(p);.
b5b0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
b5c0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
b5d0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
b5e0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
b5f0: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
b600: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
b610: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
b620: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
b630: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
b640: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
b650: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
b660: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
b670: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
b680: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61   zPtr[50];.  cha
b690: 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73  r zCom[100];.  s
b6a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b6b0: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
b6c0: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
b6d0: 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25  %4d %-13s %.2X %
b6e0: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
b6f0: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
b700: 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73  out;.  zP4 = dis
b710: 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72  playP4(pOp, zPtr
b720: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
b730: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b740: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
b750: 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79  MMENTS.  display
b760: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34  Comment(pOp, zP4
b770: 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a  , zCom, sizeof(z
b780: 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a  Com));.#else.  z
b790: 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64  Com[0] = 0;.#end
b7a0: 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65  if.  /* NB:  The
b7b0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
b7c0: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  me() function is
b7d0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
b7e0: 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a  code created.  *
b7f0: 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64  * by the mkopcod
b800: 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63  eh.awk and mkopc
b810: 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73  odec.awk scripts
b820: 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74   which extract t
b830: 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  he.  ** informat
b840: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62  ion from the vdb
b850: 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20  e.c source text 
b860: 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  */.  fprintf(pOu
b870: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c  t, zFormat1, pc,
b880: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f   .      sqlite3O
b890: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
b8a0: 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c  pcode), pOp->p1,
b8b0: 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
b8c0: 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c  3, zP4, pOp->p5,
b8d0: 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b  .      zCom.  );
b8e0: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
b8f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 61   Initialize an a
b910: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
b920: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
b930: 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72 72   void initMemArr
b940: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
b950: 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 75  , sqlite3 *db, u
b960: 31 36 20 66 6c 61 67 73 29 7b 0a 20 20 77 68 69  16 flags){.  whi
b970: 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20  le( (N--)>0 ){. 
b980: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
b990: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c     p->flags = fl
b9a0: 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61  ags;.    p->szMa
b9b0: 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  lloc = 0;.#ifdef
b9c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
b9d0: 20 20 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20    p->pScopyFrom 
b9e0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
b9f0: 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p++;.  }.}../*.*
ba00: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
ba10: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
ba20: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
ba30: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
ba40: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
ba50: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  N){.  if( p && N
ba60: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e   ){.    Mem *pEn
ba70: 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73  d = &p[N];.    s
ba80: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
ba90: 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  db;.    if( db->
baa0: 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a  pnBytesFreed ){.
bab0: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
bac0: 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f    if( p->szMallo
bad0: 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  c ) sqlite3DbFre
bae0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
baf0: 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
bb00: 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20   (++p)<pEnd );. 
bb10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
bb20: 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
bb30: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29   assert( (&p[1])
bb40: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64  ==pEnd || p[0].d
bb50: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20  b==p[1].db );.  
bb60: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
bb70: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
bb80: 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a  nvariants(p) );.
bb90: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
bba0: 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61  lock is really a
bbb0: 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f  n inlined versio
bbc0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
bbd0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20  MemRelease().   
bbe0: 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73     ** that takes
bbf0: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
bc00: 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
bc10: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75  memory cell valu
bc20: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62  e is .      ** b
bc30: 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c  eing set to NULL
bc40: 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67   after releasing
bc50: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73   any dynamic res
bc60: 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a  ources..      **
bc70: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75  .      ** The ju
bc80: 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20  stification for 
bc90: 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65  duplicating code
bca0: 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69   is that accordi
bcb0: 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ng to .      ** 
bcc0: 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20  callgrind, this 
bcd0: 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e  causes a certain
bce0: 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69   test case to hi
bcf0: 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20  t the CPU 4.7 . 
bd00: 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20       ** percent 
bd10: 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c  less (x86 linux,
bd20: 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31   gcc version 4.1
bd30: 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66  .2, -O6) than if
bd40: 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74   .      ** sqlit
bd50: 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77  e3MemRelease() w
bd60: 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ere called from 
bd70: 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20  here. With -O2, 
bd80: 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20  this jumps.     
bd90: 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65   ** to 6.6 perce
bda0: 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73  nt. The test cas
bdb0: 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31  e is inserting 1
bdc0: 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20  000 rows into a 
bdd0: 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20  table .      ** 
bde0: 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20  with no indexes 
bdf0: 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70  using a single p
be00: 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73  repared INSERT s
be10: 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29  tatement, bind()
be20: 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72   .      ** and r
be30: 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20  eset(). Inserts 
be40: 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f  are grouped into
be50: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
be60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
be70: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
be80: 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20  s & MEM_Agg );. 
be90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bea0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
beb0: 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  n );.      testc
bec0: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
bed0: 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20  MEM_Frame );.   
bee0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
bef0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
bf00: 65 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  et );.      if( 
bf10: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67  p->flags&(MEM_Ag
bf20: 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72  g|MEM_Dyn|MEM_Fr
bf30: 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20  ame|MEM_RowSet) 
bf40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
bf50: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
bf60: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
bf70: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
bf80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
bf90: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
bfa0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
bfb0: 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63       p->szMalloc
bfc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
bfd0: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
bfe0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
bff0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
c000: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  <pEnd );.  }.}..
c010: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56  /*.** Delete a V
c020: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20  dbeFrame object 
c030: 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  and its contents
c040: 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  . VdbeFrame obje
c050: 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  cts are.** alloc
c060: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50  ated by the OP_P
c070: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e  rogram opcode in
c080: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
c090: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
c0a0: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
c0b0: 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29  te(VdbeFrame *p)
c0c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  {.  int i;.  Mem
c0d0: 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61   *aMem = VdbeFra
c0e0: 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65  meMem(p);.  Vdbe
c0f0: 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d  Cursor **apCsr =
c100: 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29   (VdbeCursor **)
c110: 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d  &aMem[p->nChildM
c120: 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  em];.  for(i=0; 
c130: 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20  i<p->nChildCsr; 
c140: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
c150: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
c160: 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b  p->v, apCsr[i]);
c170: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
c180: 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e  mArray(aMem, p->
c190: 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71  nChildMem);.  sq
c1a0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
c1b0: 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62 2c  uxData(p->v->db,
c1c0: 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &p->pAuxData, -
c1d0: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
c1e0: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c  DbFree(p->v->db,
c1f0: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   p);.}..#ifndef 
c200: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
c210: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
c220: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
c230: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
c240: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
c250: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
c260: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
c270: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
c280: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
c290: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
c2a0: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
c2b0: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
c2c0: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
c2d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
c2e0: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
c2f0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
c300: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
c310: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
c320: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
c330: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
c340: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
c350: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
c360: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
c370: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
c380: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
c390: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
c3a0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
c3b0: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
c3c0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
c3d0: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
c3e0: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 20   QUERY PLAN..** 
c3f0: 32 30 31 38 2d 30 34 2d 32 34 3a 20 20 49 6e 20  2018-04-24:  In 
c400: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 6d 6f  p->explain==2 mo
c410: 64 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69 74 20  de, the OP_Init 
c420: 6f 70 63 6f 64 65 73 20 6f 66 20 74 72 69 67 67  opcodes of trigg
c430: 65 72 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ers.** are also 
c440: 73 68 6f 77 6e 2c 20 73 6f 20 74 68 61 74 20 74  shown, so that t
c450: 68 65 20 62 6f 75 6e 64 61 72 69 65 73 20 62 65  he boundaries be
c460: 74 77 65 65 6e 20 74 68 65 20 6d 61 69 6e 20 70  tween the main p
c470: 72 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a 20 65 61  rogram and.** ea
c480: 63 68 20 74 72 69 67 67 65 72 20 61 72 65 20 63  ch trigger are c
c490: 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lear..**.** When
c4a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
c4b0: 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70  first the main p
c4c0: 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64  rogram is listed
c4d0: 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a  , then each of.*
c4e0: 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73 75  * the trigger su
c4f0: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69  bprograms are li
c500: 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  sted one by one.
c510: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c520: 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dbeList(.  Vdbe 
c530: 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
c540: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
c550: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f   */.){.  int nRo
c560: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c580: 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63   Stop when row c
c590: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68 69  ount reaches thi
c5a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20  s */.  int nSub 
c5b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c5d0: 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62  umber of sub-vdb
c5e0: 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  es seen so far *
c5f0: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
c600: 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20  *apSub = 0;     
c610: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
c620: 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a  y of sub-vdbes *
c630: 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20  /.  Mem *pSub = 
c640: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
c660: 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72  ry cell hold arr
c670: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a  ay of subprogs *
c680: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
c690: 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  = p->db;        
c6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c6b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
c6c0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ion */.  int i; 
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6f0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c700: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c710: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
c720: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c730: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20  n code */.  Mem 
c740: 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
c750: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
c760: 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66   /* First Mem of
c770: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
c780: 20 69 6e 74 20 62 4c 69 73 74 53 75 62 70 72 6f   int bListSubpro
c790: 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61 69 6e  gs = (p->explain
c7a0: 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67  ==1 || (db->flag
c7b0: 73 20 26 20 53 51 4c 49 54 45 5f 54 72 69 67 67  s & SQLITE_Trigg
c7c0: 65 72 45 51 50 29 21 3d 30 29 3b 0a 20 20 4f 70  erEQP)!=0);.  Op
c7d0: 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20 61 73   *pOp = 0;..  as
c7e0: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
c7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
c800: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
c810: 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65  IC_RUN );.  asse
c820: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
c830: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
c840: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d  QLITE_BUSY || p-
c850: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
c860: 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20  M );..  /* Even 
c870: 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f  though this opco
c880: 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  de does not use 
c890: 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20  dynamic strings 
c8a0: 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73  for.  ** the res
c8b0: 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75  ult, result colu
c8c0: 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64  mns may become d
c8d0: 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73  ynamic if the us
c8e0: 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71  er calls.  ** sq
c8f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
c900: 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61  t16(), causing a
c910: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20   translation to 
c920: 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e  UTF-16 encoding.
c930: 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d  .  */.  releaseM
c940: 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29  emArray(pMem, 8)
c950: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
c960: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  t = 0;..  if( p-
c970: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
c980: 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  M ){.    /* This
c990: 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61   happens if a ma
c9a0: 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20  lloc() inside a 
c9b0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
c9c0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72  column_text() or
c9d0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
c9e0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20  column_text16() 
c9f0: 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20  failed.  */.    
ca00: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
ca10: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
ca20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
ca30: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
ca40: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
ca50: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
ca60: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
ca70: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
ca80: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
ca90: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
caa0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
cab0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
cac0: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
cad0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
cae0: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
caf0: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
cb00: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
cb10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
cb20: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
cb30: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
cb40: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
cb50: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
cb60: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
cb70: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
cb80: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
cb90: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
cba0: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
cbb0: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
cbc0: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
cbd0: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
cbe0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 62   p->nOp;.  if( b
cbf0: 4c 69 73 74 53 75 62 70 72 6f 67 73 20 29 7b 0a  ListSubprogs ){.
cc00: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
cc10: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
cc20: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
cc30: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
cc40: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
cc50: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
cc60: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
cc70: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
cc80: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
cc90: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
cca0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
ccb0: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
ccc0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
ccd0: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
cce0: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
ccf0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
cd00: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
cd10: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
cd20: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
cd30: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
cd40: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
cd50: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
cd60: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
cd70: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
cd80: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
cd90: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
cda0: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
cdb0: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
cdc0: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
cdd0: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
cde0: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
cdf0: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
ce00: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
ce10: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
ce20: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
ce30: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
ce40: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
ce50: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
ce60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
ce70: 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20 4c 6f 6f  hile(1){  /* Loo
ce80: 70 20 65 78 69 74 73 20 76 69 61 20 62 72 65 61  p exits via brea
ce90: 6b 20 2a 2f 0a 20 20 20 20 69 20 3d 20 70 2d 3e  k */.    i = p->
cea0: 70 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e  pc++;.    if( i>
ceb0: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  =nRow ){.      p
cec0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
ced0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
cee0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
cef0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cf00: 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b   if( i<p->nOp ){
cf10: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75  .      /* The ou
cf20: 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tput line number
cf30: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
cf40: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69   that we are sti
cf50: 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ll in the.      
cf60: 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  ** main program.
cf70: 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   */.      pOp = 
cf80: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
cf90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
cfa0: 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  We are currently
cfb0: 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67   listing subprog
cfc0: 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75  rams.  Figure ou
cfd0: 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a  t which one and.
cfe0: 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70        ** pick up
cff0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
d000: 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
d010: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
d020: 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   -= p->nOp;.    
d030: 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70    for(j=0; i>=ap
d040: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b  Sub[j]->nOp; j++
d050: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20  ){.        i -= 
d060: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[j]->nOp;. 
d070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
d080: 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f   = &apSub[j]->aO
d090: 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  p[i];.    }..   
d0a0: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
d0b0: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
d0c0: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
d0d0: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
d0e0: 20 68 61 73 0a 20 20 20 20 2a 2a 20 61 20 50 34   has.    ** a P4
d0f0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
d100: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
d110: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
d120: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
d130: 6d 73 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 69  ms.    ** kept i
d140: 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74  n p->aMem[9].z t
d150: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70  o hold the new p
d160: 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e  rogram - assumin
d170: 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61  g this subprogra
d180: 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  m.    ** has not
d190: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
d1a0: 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
d1b0: 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73  f( bListSubprogs
d1c0: 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d   && pOp->p4type=
d1d0: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
d1e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
d1f0: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a  e = (nSub+1)*siz
d200: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
d210: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
d220: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
d230: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
d240: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
d250: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
d260: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
d270: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
d280: 3d 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  =nSub ){.       
d290: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
d2a0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
d2b0: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
d2c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
d2d0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
d2e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
d2f0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
d300: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d310: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d320: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
d330: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
d340: 7a 3b 0a 20 20 20 20 20 20 20 20 61 70 53 75 62  z;.        apSub
d350: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
d360: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
d370: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
d380: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
d390: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
d3a0: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
d3b0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
d3c0: 20 20 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d 3e 70    nRow += pOp->p
d3d0: 34 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b  4.pProgram->nOp;
d3e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d3f0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
d400: 6e 3c 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  n<2 ) break;.   
d410: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
d420: 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 20 62  ==OP_Explain ) b
d430: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f  reak;.    if( pO
d440: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
d450: 69 74 20 26 26 20 70 2d 3e 70 63 3e 31 20 29 20  it && p->pc>1 ) 
d460: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
d470: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d480: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 75  ){.    if( db->u
d490: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
d4a0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
d4b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
d4c0: 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  T;.      rc = SQ
d4d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
d4e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
d4f0: 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72  or(p, sqlite3Err
d500: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 20  Str(p->rc));.   
d510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
d520: 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 20 20 69  ar *zP4;.      i
d530: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
d540: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
d550: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
d560: 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  t;.        pMem-
d570: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
d5a0: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
d5b0: 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20         pMem++;. 
d5c0: 20 20 20 0a 20 20 20 20 20 20 20 20 70 4d 65 6d     .        pMem
d5d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
d5e0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
d5f0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  _Term;.        p
d600: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
d610: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
d620: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
d630: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
d640: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
d650: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
d660: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
d670: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
d680: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  m->z);.        p
d690: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
d6a0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20  E_UTF8;.        
d6b0: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pMem++;.      }.
d6c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
d6d0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
d6e0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
d6f0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d710: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20    /* P1 */.     
d720: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
d730: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
d740: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
d750: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32  m->u.i = pOp->p2
d760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32             /* P2
d780: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
d790: 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ;..      pMem->f
d7a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
d7b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
d7c0: 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20  = pOp->p3;      
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
d7f0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
d800: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
d810: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
d820: 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b  ze(pMem, 100) ){
d830: 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20   /* P4 */.      
d840: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
d850: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d860: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d870: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
d880: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
d890: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
d8a0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
d8b0: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
d8c0: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  4(pOp, pMem->z, 
d8d0: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b  pMem->szMalloc);
d8e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 21 3d  .      if( zP4!=
d8f0: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
d900: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a     pMem->n = 0;.
d910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d920: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
d930: 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49  m, zP4, -1, SQLI
d940: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
d950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d960: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
d970: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  z!=0 );.        
d980: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
d990: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
d9a0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  z);.        pMem
d9b0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
d9c0: 54 46 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TF8;.      }.   
d9d0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
d9e0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
d9f0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==1 ){.        i
da00: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
da10: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
da20: 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20  pMem, 4) ){.    
da30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
da40: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
da50: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d );.          r
da60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
da70: 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
da80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
da90: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
daa0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d  Term;.        pM
dab0: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20  em->n = 2;.     
dac0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
dad0: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
dae0: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
daf0: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
db00: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
db10: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
db20: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
db30: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
db40: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
db50: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 20  COMMENTS.       
db60: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
db70: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
db80: 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a  e(pMem, 500) ){.
db90: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
dba0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
dbb0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
dbc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dbd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
dbe0: 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  }.        pMem->
dbf0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
dc00: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
dc10: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
dc20: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
dc30: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
dc40: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  0);.        pMem
dc50: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
dc60: 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  TF8;.#else.     
dc70: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
dc80: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23   /* Comment */.#
dcb0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 0a 20  endif.      }.. 
dcc0: 20 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75       p->nResColu
dcd0: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
dce0: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 20  xplain-1);.     
dcf0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
dd00: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
dd10: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
dd20: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20  TE_OK;.      rc 
dd30: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
dd40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
dd50: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
dd60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
dd70: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
dd80: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
dd90: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
dda0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
ddb0: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
ddc0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
ddd0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
dde0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
ddf0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
de00: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
de10: 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  Sql ){.    z = p
de20: 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20  ->zSql;.  }else 
de30: 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b  if( p->nOp>=1 ){
de40: 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f  .    const VdbeO
de50: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
de60: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  [0];.    if( pOp
de70: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
de80: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
de90: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
dea0: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
deb0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
dec0: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
ded0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
dee0: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
def0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
df00: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
df10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
df20: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
df30: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
df40: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
df50: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
df60: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
df70: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
df80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
df90: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
dfa0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
dfb0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
dfc0: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
dfd0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
dfe0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
dff0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
e000: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
e010: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
e020: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
e030: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
e040: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
e050: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
e060: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
e070: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
e080: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
e090: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
e0a0: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
e0b0: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
e0c0: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
e0d0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
e0e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
e0f0: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
e100: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
e110: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
e120: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
e130: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e150: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
e160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e170: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
e180: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
e190: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
e1a0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
e1b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
e1c0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
e1d0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
e1e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
e1f0: 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63  this object desc
e200: 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72  ribes bulk memor
e210: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
e220: 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d  use.** by subcom
e230: 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65  ponents of a pre
e240: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
e250: 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63    Space is alloc
e260: 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61  ated out.** of a
e270: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
e280: 62 6a 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c  bject by the all
e290: 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e  ocSpace() routin
e2a0: 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75  e below..*/.stru
e2b0: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
e2c0: 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b   {.  u8 *pSpace;
e2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61            /* Ava
e2e0: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f  ilable memory */
e2f0: 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
e300: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
e310: 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65   of available me
e320: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  mory */.  int nN
e330: 65 65 64 65 64 3b 20 20 20 20 20 20 20 20 20 2f  eeded;         /
e340: 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68  * Total bytes th
e350: 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  at could not be 
e360: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a  allocated */.};.
e370: 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63  ./* Try to alloc
e380: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
e390: 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
e3a0: 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f  d bulk memory fo
e3b0: 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74  r pBuf.** from t
e3c0: 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  he ReusableSpace
e3d0: 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e   object.  Return
e3e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
e3f0: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d  e allocated.** m
e400: 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73  emory on success
e410: 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65  .  If insufficie
e420: 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  nt memory is ava
e430: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  ilable in the.**
e440: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
e450: 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20  bject, increase 
e460: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
e470: 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c  e.nNeeded.** val
e480: 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  ue by the amount
e490: 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74 75   needed and retu
e4a0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
e4b0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e  f pBuf is not in
e4c0: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
e4d0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
e4e0: 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72  e memory has alr
e4f0: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  eady.** been all
e500: 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  ocated by a prio
e510: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  r call to this r
e520: 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20  outine, so just 
e530: 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a  return a copy.**
e540: 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61   of pBuf and lea
e550: 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ve ReusableSpace
e560: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
e570: 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72  * This allocator
e580: 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20   is employed to 
e590: 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64  repurpose unused
e5a0: 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e   slots at the en
e5b0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f  d of the.** opco
e5c0: 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65 70  de array of prep
e5d0: 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f  ared state for o
e5e0: 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64  ther memory need
e5f0: 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65  s of the prepare
e600: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a  d.** statement..
e610: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
e620: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74  allocSpace(.  st
e630: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
e640: 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20  ce *p,  /* Bulk 
e650: 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  memory available
e660: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
e670: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e690: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  * Pointer to a p
e6a0: 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  rior allocation 
e6b0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20  */.  int nByte  
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6d0: 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  * Bytes of memor
e6e0: 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20  y needed */.){. 
e6f0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
e700: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d  YTE_ALIGNMENT(p-
e710: 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66  >pSpace) );.  if
e720: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
e730: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
e740: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
e750: 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65  nByte <= p->nFre
e760: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46  e ){.      p->nF
e770: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
e780: 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70      pBuf = &p->p
e790: 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b  Space[p->nFree];
e7a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e7b0: 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20    p->nNeeded += 
e7c0: 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  nByte;.    }.  }
e7d0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
e7e0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
e7f0: 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72  pBuf) );.  retur
e800: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
e810: 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45   Rewind the VDBE
e820: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
e830: 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72  inning in prepar
e840: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e  ation for.** run
e850: 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  ning it..*/.void
e860: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
e870: 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  nd(Vdbe *p){.#if
e880: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
e890: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
e8a0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
e8b0: 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
e8c0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
e8d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
e8e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
e8f0: 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67 69  _INIT || p->magi
e900: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 45  c==VDBE_MAGIC_RE
e910: 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  SET );..  /* The
e920: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
e930: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
e940: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e950: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
e960: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
e970: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
e980: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
e990: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
e9a0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
e9b0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
e9c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e9d0: 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  G.  for(i=0; i<p
e9e0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
e9f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
ea00: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
ea10: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
ea20: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
ea30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ea40: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
ea50: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
ea60: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
ea70: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
ea80: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
ea90: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
eaa0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
eab0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
eac0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
ead0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
eae0: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
eaf0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
eb00: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
eb10: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
eb20: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
eb30: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
eb40: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
eb50: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
eb60: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
eb70: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
eb80: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
eb90: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
eba0: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
ebb0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
ebc0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
ebd0: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e  registers and in
ebe0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
ebf0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
ec00: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
ec10: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
ec20: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
ec30: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
ec40: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
ec50: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
ec60: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
ec70: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
ec80: 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f  called exactly o
ec90: 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74  nce on each virt
eca0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
ecb0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
ecc0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
ecd0: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
ece0: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
ecf0: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
ed00: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
ed10: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
ed20: 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
ed30: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
ed40: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
ed50: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
ed60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
ed70: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
ed80: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
ed90: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
eda0: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
edb0: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
edc0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
edd0: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
ede0: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
edf0: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
ee00: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
ee10: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
ee20: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
ee30: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
ee40: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
ee50: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
ee60: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
ee70: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
ee80: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
ee90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
eea0: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
eeb0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
eee0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ef10: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
ef20: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
ef30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ef40: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
ef50: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
ef60: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
ef70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ef80: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
ef90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
efc0: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
efd0: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
efe0: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
eff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f000: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
f010: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
f020: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f040: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
f050: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
f060: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ms */.  int n;  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f080: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
f090: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72 75  ounter */.  stru
f0a0: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
f0b0: 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65   x;        /* Re
f0c0: 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f  usable bulk memo
f0d0: 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ry */..  assert(
f0e0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
f0f0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
f100: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
f110: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f120: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
f130: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
f140: 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70  ssert( pParse==p
f150: 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62  ->pParse );.  db
f160: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
f170: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
f180: 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61  iled==0 );.  nVa
f190: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  r = pParse->nVar
f1a0: 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73  ;.  nMem = pPars
f1b0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73  e->nMem;.  nCurs
f1c0: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
f1d0: 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72  b;.  nArg = pPar
f1e0: 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a  se->nMaxArg;.  .
f1f0: 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73 6f 72    /* Each cursor
f200: 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79 20 63   uses a memory c
f210: 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73 74 20  ell.  The first 
f220: 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72 20 30  cursor (cursor 0
f230: 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61  ) can.  ** use a
f240: 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69 73 20  Mem[0] which is 
f250: 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 75 73  not otherwise us
f260: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 70  ed by the VDBE p
f270: 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61 74  rogram.  Allocat
f280: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61 74 20  e.  ** space at 
f290: 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d 5b  the end of aMem[
f2a0: 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20 31 20  ] for cursors 1 
f2b0: 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20 20 2a  and greater..  *
f2c0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f  * See also: allo
f2d0: 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20  cateCursor()..  
f2e0: 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75  */.  nMem += nCu
f2f0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75 72  rsor;.  if( nCur
f300: 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e 30  sor==0 && nMem>0
f310: 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53   ) nMem++;  /* S
f320: 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30 5d  pace for aMem[0]
f330: 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65   even if not use
f340: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  d */..  /* Figur
f350: 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 72  e out how much r
f360: 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69  eusable memory i
f370: 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74  s available at t
f380: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
f390: 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  ** opcode array.
f3a0: 20 20 54 68 69 73 20 65 78 74 72 61 20 6d 65 6d    This extra mem
f3b0: 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65 61 6c  ory will be real
f3c0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74 68 65  located for othe
f3d0: 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  r elements.  ** 
f3e0: 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 20  of the prepared 
f3f0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
f400: 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a    n = ROUND8(siz
f410: 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b  eof(Op)*p->nOp);
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f430: 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65   Bytes of opcode
f440: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a   memory used */.
f450: 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26 28 28    x.pSpace = &((
f460: 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20  u8*)p->aOp)[n]; 
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f480: 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 6d   Unused opcode m
f490: 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
f4a0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
f4b0: 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63 65  IGNMENT(x.pSpace
f4c0: 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d  ) );.  x.nFree =
f4d0: 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72   ROUNDDOWN8(pPar
f4e0: 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20  se->szOpAlloc - 
f4f0: 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66  n);  /* Bytes of
f500: 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a   unused memory *
f510: 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e 46  /.  assert( x.nF
f520: 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ree>=0 );.  asse
f530: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
f540: 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61  LIGNMENT(&x.pSpa
f550: 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a  ce[x.nFree]) );.
f560: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
f570: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
f580: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
f590: 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
f5a0: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
f5b0: 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
f5c0: 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
f5d0: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
f5e0: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
f5f0: 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d  m = 10;.  }.  p-
f600: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20  >expired = 0;.. 
f610: 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72   /* Memory for r
f620: 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65  egisters, parame
f630: 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74  ters, cursor, et
f640: 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  c, is allocated 
f650: 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20  in one or two.  
f660: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
f670: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
f680: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
f690: 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20  nused memory at 
f6a0: 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
f6b0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
f6c0: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
f6d0: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
f6e0: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
f6f0: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
f700: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
f710: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
f720: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
f730: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
f740: 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  ll in the remain
f750: 64 65 72 20 75 73 69 6e 67 20 61 20 66 72 65 73  der using a fres
f760: 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  h memory allocat
f770: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
f780: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
f790: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
f7a0: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
f7b0: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
f7c0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
f7d0: 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20  tover memory at 
f7e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
f7f0: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
f800: 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  is can significa
f810: 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65  ntly.  ** reduce
f820: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
f830: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20  emory held by a 
f840: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
f850: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a  nt..  */.  do {.
f860: 20 20 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20      x.nNeeded = 
f870: 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  0;.    p->aMem =
f880: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
f890: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
f8a0: 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20  zeof(Mem));.    
f8b0: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
f8c0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72  pace(&x, p->aVar
f8d0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
f8e0: 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72  m));.    p->apAr
f8f0: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  g = allocSpace(&
f900: 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  x, p->apArg, nAr
f910: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b  g*sizeof(Mem*));
f920: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
f930: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
f940: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
f950: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
f960: 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51  or*));.#ifdef SQ
f970: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
f980: 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20  _SCANSTATUS.    
f990: 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f  p->anExec = allo
f9a0: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e  cSpace(&x, p->an
f9b0: 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  Exec, p->nOp*siz
f9c0: 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69  eof(i64));.#endi
f9d0: 66 0a 20 20 20 20 69 66 28 20 78 2e 6e 4e 65 65  f.    if( x.nNee
f9e0: 64 65 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ded==0 ) break;.
f9f0: 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70      x.pSpace = p
fa00: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
fa10: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
fa20: 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20  b, x.nNeeded);. 
fa30: 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e     x.nFree = x.n
fa40: 4e 65 65 64 65 64 3b 0a 20 20 7d 77 68 69 6c 65  Needed;.  }while
fa50: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
fa60: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 70 56 4c  led );..  p->pVL
fa70: 69 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 56  ist = pParse->pV
fa80: 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 2d 3e  List;.  pParse->
fa90: 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20 70  pVList =  0;.  p
faa0: 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72  ->explain = pPar
fab0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 69  se->explain;.  i
fac0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
fad0: 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  led ){.    p->nV
fae0: 61 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  ar = 0;.    p->n
faf0: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
fb00: 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d  p->nMem = 0;.  }
fb10: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43 75  else{.    p->nCu
fb20: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
fb30: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79      p->nVar = (y
fb40: 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 69  nVar)nVar;.    i
fb50: 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  nitMemArray(p->a
fb60: 56 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20 4d  Var, nVar, db, M
fb70: 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70 2d  EM_Null);.    p-
fb80: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20  >nMem = nMem;.  
fb90: 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70    initMemArray(p
fba0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62  ->aMem, nMem, db
fbb0: 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 29  , MEM_Undefined)
fbc0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
fbd0: 61 70 43 73 72 2c 20 30 2c 20 6e 43 75 72 73 6f  apCsr, 0, nCurso
fbe0: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
fbf0: 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53  sor*));.#ifdef S
fc00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
fc10: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20  T_SCANSTATUS.   
fc20: 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78 65   memset(p->anExe
fc30: 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  c, 0, p->nOp*siz
fc40: 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69  eof(i64));.#endi
fc50: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  f.  }.  sqlite3V
fc60: 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a  dbeRewind(p);.}.
fc70: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
fc80: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
fc90: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
fca0: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
fcb0: 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73  rsor .** happens
fcc0: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
fcd0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
fce0: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
fcf0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
fd00: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
fd10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
fd20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 78   }.  assert( pCx
fd30: 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43 78  ->pBtx==0 || pCx
fd40: 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
fd50: 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73  YPE_BTREE );.  s
fd60: 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72  witch( pCx->eCur
fd70: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
fd80: 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a   CURTYPE_SORTER:
fd90: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
fda0: 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28  VdbeSorterClose(
fdb0: 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20  p->db, pCx);.   
fdc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fdd0: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
fde0: 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20  _BTREE: {.      
fdf0: 69 66 28 20 70 43 78 2d 3e 69 73 45 70 68 65 6d  if( pCx->isEphem
fe00: 65 72 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  eral ){.        
fe10: 69 66 28 20 70 43 78 2d 3e 70 42 74 78 20 29 20  if( pCx->pBtx ) 
fe20: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
fe30: 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20  e(pCx->pBtx);.  
fe40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78        /* The pCx
fe50: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
fe60: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
fe70: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
fe80: 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20  sts, by.        
fe90: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
fea0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  e. */.      }els
feb0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
fec0: 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  t( pCx->uc.pCurs
fed0: 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  or!=0 );.       
fee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
fef0: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63  seCursor(pCx->uc
ff00: 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .pCursor);.     
ff10: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
ff20: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ff30: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ff40: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
ff50: 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a  CURTYPE_VTAB: {.
ff60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
ff70: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72  ab_cursor *pVCur
ff80: 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72   = pCx->uc.pVCur
ff90: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71  ;.      const sq
ffa0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
ffb0: 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70  odule = pVCur->p
ffc0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
ffd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43       assert( pVC
ffe0: 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e  ur->pVtab->nRef>
fff0: 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72  0 );.      pVCur
10000 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b  ->pVtab->nRef--;
10010 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  .      pModule->
10020 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20  xClose(pVCur);. 
10030 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10040 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
10050 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
10060 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63  cursors in the c
10070 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f  urrent frame..*/
10080 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
10090 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
100a0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
100b0 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20   p->apCsr ){.   
100c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
100d0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
100e0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56  r; i++){.      V
100f0 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
10100 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
10110 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20     if( pC ){.   
10120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10130 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
10140 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
10150 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
10160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
10170 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
10180 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
10190 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73   the VdbeFrame s
101a0 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
101b0 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73  Vdbe. This.** is
101c0 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70   used, for examp
101d0 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67  le, when a trigg
101e0 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  er sub-program i
101f0 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74  s halted to rest
10200 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74  ore.** control t
10210 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  o the main progr
10220 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  am..*/.int sqlit
10230 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
10240 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46  re(VdbeFrame *pF
10250 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  rame){.  Vdbe *v
10260 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20   = pFrame->v;.  
10270 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
10280 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53  ame(v);.#ifdef S
10290 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
102a0 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76  T_SCANSTATUS.  v
102b0 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d  ->anExec = pFram
102c0 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69  e->anExec;.#endi
102d0 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  f.  v->aOp = pFr
102e0 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
102f0 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
10300 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
10310 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
10320 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
10330 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
10340 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
10350 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
10360 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
10370 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
10380 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
10390 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
103a0 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
103b0 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
103c0 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
103d0 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
103e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
103f0 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62  eteAuxData(v->db
10400 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &v->pAuxData, 
10410 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75  -1, 0);.  v->pAu
10420 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e  xData = pFrame->
10430 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61  pAuxData;.  pFra
10440 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30  me->pAuxData = 0
10450 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
10460 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
10470 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
10480 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
10490 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
104a0 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
104b0 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
104c0 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
104d0 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
104e0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
104f0 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
10500 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
10510 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
10520 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
10530 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
10540 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
10550 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
10560 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
10570 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10580 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
10590 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
105a0 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
105b0 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
105c0 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
105d0 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
105e0 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
105f0 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
10600 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
10610 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
10620 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
10630 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
10640 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
10650 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10660 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
10670 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
10680 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
10690 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
106a0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
106b0 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  ->aMem, p->nMem)
106c0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
106d0 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
106e0 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
106f0 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
10700 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
10710 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
10720 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
10730 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
10740 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
10750 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
10760 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
10770 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
10780 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
10790 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
107a0 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
107b0 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61  ->db, &p->pAuxDa
107c0 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73  ta, -1, 0);.  as
107d0 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74  sert( p->pAuxDat
107e0 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a==0 );.}../*.**
107f0 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
10800 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
10810 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
10820 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
10830 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
10840 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
10850 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
10860 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
10870 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
10880 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
10890 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
108a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
108b0 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
108c0 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
108d0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
108e0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
108f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10900 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
10910 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
10920 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20  sColumn){.  int 
10930 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
10940 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28   = p->db;..  if(
10950 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29   p->nResColumn )
10960 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
10970 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
10980 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
10990 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 20  *COLNAME_N);.   
109a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
109b0 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
109c0 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52 65 73 43  .  }.  n = nResC
109d0 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
109e0 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
109f0 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
10a00 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
10a10 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
10a20 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
10a30 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
10a40 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
10a50 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
10a60 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  n;.  initMemArra
10a70 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e  y(p->aColName, n
10a80 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  , db, MEM_Null);
10a90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
10aa0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
10ab0 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
10ac0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
10ad0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
10ae0 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
10af0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
10b00 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
10b10 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
10b20 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
10b30 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
10b40 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
10b50 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
10b60 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61  .** The final pa
10b70 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d  rameter, xDel, m
10b80 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51  ust be one of SQ
10b90 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51  LITE_DYNAMIC, SQ
10ba0 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f  LITE_STATIC.** o
10bb0 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  r SQLITE_TRANSIE
10bc0 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c  NT. If it is SQL
10bd0 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ITE_DYNAMIC, the
10be0 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
10bf0 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e  nted.** to by zN
10c00 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ame will be free
10c10 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72  d by sqlite3DbFr
10c20 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
10c30 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e  be is destroyed.
10c40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10c50 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20  dbeSetColName(. 
10c60 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20    /* Vdbe being 
10c90 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20  configured */.  
10ca0 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
10cd0 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65  umn zName applie
10ce0 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61  s to */.  int va
10cf0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
10d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
10d10 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45  e of the COLNAME
10d20 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
10d30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10d40 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
10d50 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
10d60 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
10d70 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69  ng name */.  voi
10d80 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  d (*xDel)(void*)
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10da0 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   Memory manageme
10db0 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  nt strategy for 
10dc0 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zName */.){.  in
10dd0 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
10de0 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
10df0 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
10e00 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
10e10 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
10e20 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
10e30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
10e40 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65    assert( !zName
10e50 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45   || xDel!=SQLITE
10e60 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
10e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10e80 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
10e90 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e  assert( p->aColN
10ea0 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ame!=0 );.  pCol
10eb0 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  Name = &(p->aCol
10ec0 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e  Name[idx+var*p->
10ed0 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20  nResColumn]);.  
10ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
10ef0 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
10f00 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  me, zName, -1, S
10f10 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c  QLITE_UTF8, xDel
10f20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
10f30 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20  =0 || !zName || 
10f40 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73  (pColName->flags
10f50 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b  &MEM_Term)!=0 );
10f60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10f70 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72  ./*.** A read or
10f80 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
10f90 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  on may or may no
10fa0 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64  t be active on d
10fb0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
10fc0 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73  * db. If a trans
10fd0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
10fe0 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20  , commit it. If 
10ff0 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72  there is a.** wr
11000 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
11010 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68  spanning more th
11020 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
11030 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69  file, this routi
11040 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65  ne.** takes care
11050 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
11060 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e  ournal trickery.
11070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
11080 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65  dbeCommit(sqlite
11090 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
110a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
110b0 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
110c0 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
110d0 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
110e0 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
110f0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tion.           
11100 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
11110 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
11120 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  or a two-phase c
11130 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20 20  ommit using a.  
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
11160 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  al */.  int rc =
11170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
11180 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
11190 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
111a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
111b0 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
111c0 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
111d0 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
111e0 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
111f0 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
11200 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
11210 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
11220 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
11230 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
11240 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
11250 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
11260 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
11270 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
11280 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
11290 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
112a0 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
112b0 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
112c0 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
112d0 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
112e0 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
112f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11300 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
11310 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
11320 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
11330 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
11340 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
11350 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
11360 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
11370 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
11380 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20   p);..  /* This 
11390 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
113a0 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
113b0 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
113c0 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
113d0 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
113e0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
113f0 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
11400 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
11410 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
11420 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
11430 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
11440 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
11450 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
11460 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
11470 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
11480 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
11490 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
114a0 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
114b0 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
114c0 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
114d0 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  / .  for(i=0; rc
114e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
114f0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
11500 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
11510 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11520 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11530 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
11540 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
11550 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
11560 61 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  a database might
11570 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20 6a   need a master j
11580 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20 75  ournal depends u
11590 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74 73  pon.      ** its
115a0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61   journal mode (a
115b0 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e 67  mong other thing
115c0 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69 78  s).  This matrix
115d0 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
115e0 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  h.      ** journ
115f0 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20 6d  al modes use a m
11600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
11610 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a  d which do not *
11620 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
11630 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64 65  onst u8 aMJNeede
11640 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  d[] = {.        
11650 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20 20  /* DELETE   */  
11660 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 45  1,.        /* PE
11670 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20  RSIST   */ 1,.  
11680 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20 20        /* OFF    
11690 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20     */ 0,.       
116a0 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a 2f   /* TRUNCATE  */
116b0 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d   1,.        /* M
116c0 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20  EMORY    */ 0,. 
116d0 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20 20         /* WAL   
116e0 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d      */ 0.      }
116f0 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  ;.      Pager *p
11700 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67 65  Pager;   /* Page
11710 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
11720 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e  h pBt */.      n
11730 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
11740 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
11750 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
11760 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
11770 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
11780 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  Bt);.      if( d
11790 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74 79  b->aDb[i].safety
117a0 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53 59  _level!=PAGER_SY
117b0 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20  NCHRONOUS_OFF.  
117c0 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64 65       && aMJNeede
117d0 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d[sqlite3PagerGe
117e0 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61  tJournalMode(pPa
117f0 67 65 72 29 5d 0a 20 20 20 20 20 20 20 26 26 20  ger)].       && 
11800 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65  sqlite3PagerIsMe
11810 6d 64 62 28 70 50 61 67 65 72 29 3d 3d 30 0a 20  mdb(pPager)==0. 
11820 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20       ){ .       
11830 20 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b   assert( i!=1 );
11840 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b  .        nTrans+
11850 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
11860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11870 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
11880 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
11890 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
118a0 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
118b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
118c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
118d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
118e0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
118f0 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
11900 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
11910 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
11920 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
11930 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
11940 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
11950 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
11960 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
11970 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
11980 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
11990 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
119a0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
119b0 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a  MMITHOOK;.    }.
119c0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
119d0 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
119e0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
119f0 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
11a00 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
11a10 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
11a20 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
11a30 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
11a40 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
11a50 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
11a60 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
11a70 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
11a80 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
11a90 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
11aa0 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
11ab0 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
11ac0 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
11ad0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
11ae0 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
11af0 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
11b00 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
11b10 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
11b20 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
11b30 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
11b40 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
11b50 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
11b60 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
11b70 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
11b80 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
11b90 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
11ba0 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
11bb0 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
11bc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
11bd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
11be0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
11bf0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
11c00 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
11c10 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
11c20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11c30 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
11c40 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
11c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11c60 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
11c70 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
11c80 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
11c90 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
11ca0 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
11cb0 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
11cc0 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
11cd0 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
11ce0 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
11cf0 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
11d00 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
11d10 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
11d20 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
11d30 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
11d40 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
11d50 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
11d60 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
11d70 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
11d80 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
11d90 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
11da0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
11db0 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
11dc0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
11dd0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11de0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11df0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
11e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11e10 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
11e20 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
11e30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11e50 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11e60 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
11e70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11e80 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
11e90 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
11ea0 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
11eb0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
11ec0 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
11ed0 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
11ee0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
11ef0 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
11f00 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
11f10 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
11f20 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ally..  */.#ifnd
11f30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
11f40 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
11f50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
11f60 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
11f70 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
11f80 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
11f90 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
11fa0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
11fb0 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
11fc0 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
11fd0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
11fe0 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
11ff0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
12000 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
12010 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
12020 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
12030 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
12040 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
12050 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
12060 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
12070 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12080 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
12090 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
120a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
120b0 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
120c0 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
120d0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
120e0 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
120f0 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
12100 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
12110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12120 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b  M_BKPT;.    do {
12130 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
12140 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  om;.      if( re
12150 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  tryCount ){.    
12160 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
12170 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  nt>100 ){.      
12180 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
12190 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
121a0 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d   delete: %s", zM
121b0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
121c0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
121d0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
121e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62   0);.          b
121f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
12200 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75  lse if( retryCou
12210 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  nt==1 ){.       
12220 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
12230 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
12240 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d  collide: %s", zM
12250 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
12260 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
12270 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20  retryCount++;.  
12280 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
12290 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
122a0 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
122b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
122c0 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a  _snprintf(13, &z
122d0 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65  Master[nMainFile
122e0 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58  ], "-mj%06X9%02X
122f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30    (iRandom>>8)&0
12320 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d  xffffff, iRandom
12330 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a  &0xff);.      /*
12340 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69   The antipenulti
12350 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f  mate character o
12360 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
12370 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20  rnal name must. 
12380 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74       ** be "9" t
12390 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c  o avoid name col
123a0 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69  lisions when usi
123b0 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  ng 8+3 filenames
123c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
123d0 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74  t( zMaster[sqlit
123e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74  e3Strlen30(zMast
123f0 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20  er)-3]=='9' );. 
12400 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65       sqlite3File
12410 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c  Suffix3(zMainFil
12420 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  e, zMaster);.   
12430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12440 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
12450 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
12460 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
12470 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  s);.    }while( 
12480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12490 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20   res );.    if( 
124a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
124b0 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
124c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
124d0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  l. */.      rc =
124e0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
124f0 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
12500 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
12510 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
12520 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
12530 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
12540 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E|.          SQL
12550 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
12560 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
12570 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
12580 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
12590 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
125a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
125b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
125c0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
125d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
125e0 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
125f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
12600 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
12610 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
12620 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
12630 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
12640 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
12650 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
12660 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
12670 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
12680 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
12690 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
126a0 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
126b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
126c0 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
126d0 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
126e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
126f0 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
12700 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
12710 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
12720 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
12730 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
12740 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
12750 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
12760 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
12770 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
12780 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12790 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
127a0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
127b0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
127c0 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
127d0 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
127e0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
127f0 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   zFile==0 ){.   
12800 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
12810 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
12820 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
12830 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
12840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
12850 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30  ert( zFile[0]!=0
12860 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
12870 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
12880 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
12890 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
128a0 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
128b0 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
128c0 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
128d0 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
128e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
128f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12900 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12910 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
12920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
12930 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
12940 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
12950 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12960 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
12970 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
12980 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12990 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
129a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
129b0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
129c0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
129d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
129e0 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
129f0 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
12a00 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
12a10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12a20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
12a30 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
12a40 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
12a50 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
12a60 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
12a70 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
12a80 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
12a90 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
12aa0 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
12ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12ac0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
12ad0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
12ae0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
12af0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
12b00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12b10 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
12b20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12b30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
12b40 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
12b50 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
12b60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
12b70 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
12b80 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
12b90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
12ba0 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
12bb0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
12bc0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
12bd0 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
12be0 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
12bf0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12c00 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
12c10 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
12c20 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
12c30 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
12c40 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
12c50 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12c60 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
12c70 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
12c80 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
12c90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12ca0 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
12cb0 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
12cc0 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
12cd0 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
12ce0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12cf0 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
12d00 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
12d10 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
12d20 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
12d30 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
12d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
12d50 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
12d60 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
12d70 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
12d80 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
12d90 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
12da0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
12db0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12dc0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12dd0 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
12de0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12df0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
12e00 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
12e10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
12e20 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  !=SQLITE_BUSY );
12e30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12e50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12e60 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12e80 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74   }..    /* Delet
12e90 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
12ea0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
12eb0 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e  commits the tran
12ec0 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20  saction. After. 
12ed0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73     ** doing this
12ee0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
12ef0 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62  s synced again b
12f00 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69  efore any indivi
12f10 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e  dual.    ** tran
12f20 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72  saction files ar
12f30 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
12f40 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
12f50 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
12f60 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20   zMaster, 1);.  
12f70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12f80 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12f90 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
12fa0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12fb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12fc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
12fd0 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
12fe0 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
12ff0 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
13000 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
13010 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
13020 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
13030 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
13040 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
13050 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
13060 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
13070 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
13080 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
13090 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
130a0 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
130b0 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
130c0 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
130d0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
130e0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
130f0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
13100 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
13110 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
13120 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
13130 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
13140 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
13150 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
13160 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
13170 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
13180 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
13190 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
131a0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
131b0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
131c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
131d0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
131e0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
131f0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
13200 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
13210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13220 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
13230 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20  Two(pBt, 1);.   
13240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
13250 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
13260 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
13270 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13280 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
13290 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
132a0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
132b0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
132c0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
132d0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
132e0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e  at the sqlite3.n
132f0 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74  VdbeActive count
13300 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
13310 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
13320 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
13330 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
13340 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
13350 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
13360 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
13370 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
13380 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
13390 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
133a0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
133b0 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
133c0 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
133d0 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
133e0 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
133f0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
13400 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
13410 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
13420 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
13430 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
13440 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
13450 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
13460 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
13470 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
13480 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b    int nRead = 0;
13490 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
134a0 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
134b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
134c0 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74  stmt_busy((sqlit
134d0 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20  e3_stmt*)p) ){. 
134e0 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
134f0 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
13500 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
13510 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49  .      if( p->bI
13520 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b  sReader ) nRead+
13530 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
13540 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
13550 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
13560 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b  ->nVdbeActive );
13570 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
13580 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  e==db->nVdbeWrit
13590 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
135a0 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52  Read==db->nVdbeR
135b0 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ead );.}.#else.#
135c0 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
135d0 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
135e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
135f0 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
13600 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
13610 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
13620 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
13630 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
13640 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
13650 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
13660 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
13670 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
13680 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
13690 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
136a0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
136b0 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
136c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
136d0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
136e0 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
136f0 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
13700 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
13710 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
13720 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
13730 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
13740 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
13750 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
13760 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
13770 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
13780 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
13790 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
137a0 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c  NLINE int vdbeCl
137b0 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
137c0 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
137d0 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
137e0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
137f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13800 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  K;.  int i;.  co
13810 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
13820 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
13830 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt-1;..  assert(
13840 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
13850 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
13860 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
13870 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  SE);.  assert( d
13880 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
13890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
138a0 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
138b0 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
138c0 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
138d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
138e0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
138f0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
13900 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20  E_OK;.    Btree 
13910 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
13920 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
13930 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Bt ){.      if( 
13940 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
13950 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
13960 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13970 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
13980 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
13990 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
139a0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
139b0 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
139c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
139d0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
139e0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
139f0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
13a00 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
13a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13a30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
13a40 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
13a50 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e     }.  }.  db->n
13a60 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70  Statement--;.  p
13a70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
13a80 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
13a90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
13aa0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
13ab0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
13ac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
13ad0 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
13ae0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
13af0 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
13b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13b20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13b30 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
13b40 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
13b50 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
13b60 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
13b70 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
13b80 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13b90 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
13ba0 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
13bb0 74 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64  tore the .  ** d
13bc0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
13bd0 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
13be0 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74  int counter to t
13bf0 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20  he value it had 
13c00 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73  when .  ** the s
13c10 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
13c20 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
13c30 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d    */.  if( eOp==
13c40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
13c50 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44  CK ){.    db->nD
13c60 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
13c70 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
13c80 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13c90 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  ImmCons = p->nSt
13ca0 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20  mtDefImmCons;.  
13cb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13cc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13cd0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
13ce0 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
13cf0 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e  {.  if( p->db->n
13d00 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e  Statement && p->
13d10 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  iStatement ){.  
13d20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f    return vdbeClo
13d30 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
13d40 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Op);.  }.  retur
13d50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13d60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13d70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
13d80 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
13d90 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
13da0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
13db0 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
13dc0 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
13dd0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
13de0 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
13df0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
13e00 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
13e10 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
13e20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
13e30 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
13e40 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
13e50 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
13e60 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
13e70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
13e80 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
13e90 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
13ea0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
13eb0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
13ec0 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
13ed0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
13ee0 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
13ef0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
13f00 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
13f10 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
13f20 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
13f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13f40 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
13f50 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
13f60 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
13f70 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
13f80 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
13f90 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
13fa0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
13fb0 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
13fc0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
13fd0 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
13fe0 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
13ff0 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
14000 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
14010 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
14020 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
14030 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
14040 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
14050 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
14060 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
14070 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45  beError(p, "FORE
14080 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
14090 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
140a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
140b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
140c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
140d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
140e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
140f0 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
14100 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
14110 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
14120 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
14130 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
14140 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
14150 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
14160 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
14170 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
14180 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
14190 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
141a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
141b0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
141c0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
141d0 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
141e0 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
141f0 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
14200 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
14210 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
14220 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
14230 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
14240 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
14250 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
14260 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
14270 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
14280 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
14290 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
142a0 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
142b0 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
142c0 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
142d0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
142e0 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
142f0 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
14300 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
14310 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
14320 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
14330 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
14340 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
14350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
14370 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
14380 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
14390 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
143a0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
143b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
143c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
143d0 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
143e0 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
143f0 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
14400 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
14410 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
14420 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
14430 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
14440 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
14450 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
14460 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
14470 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
14480 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
14490 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
144a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
144b0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
144c0 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
144d0 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
144e0 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
144f0 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
14500 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
14510 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
14520 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
14530 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
14540 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
14550 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
14560 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
14570 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
14580 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
14590 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
145a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
145b0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
145c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
145d0 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
145e0 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
145f0 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
14600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14610 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
14620 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14630 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
14640 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
14650 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
14660 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74  s(p);.  checkAct
14670 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
14680 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
14690 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
146a0 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
146b0 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
146c0 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53  or if the.  ** S
146d0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65  QL statement doe
146e0 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72  s not read or wr
146f0 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ite a database f
14700 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ile.  */.  if( p
14710 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49  ->pc>=0 && p->bI
14720 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69  sReader ){.    i
14730 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
14740 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
14750 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20  from p->rc */.  
14760 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74    int eStatement
14770 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Op = 0;.    int 
14780 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
14790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
147a0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27  t to true if a '
147b0 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a  special' error *
147c0 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
147d0 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
147e0 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
147f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
14800 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  beEnter(p);..   
14810 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
14820 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
14830 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
14840 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
14850 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  f;.    isSpecial
14860 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
14870 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
14880 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
148b0 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
148c0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
148d0 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
148e0 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
148f0 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
14900 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
14910 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
14920 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
14930 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
14940 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
14950 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
14960 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
14970 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
14980 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
14990 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
149a0 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
149b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
149c0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
149d0 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
149e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
149f0 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
14a00 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
14a10 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
14a20 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
14a30 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
14a40 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
14a50 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
14a60 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
14a70 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
14a80 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72  ccurred while wr
14a90 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
14aa0 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
14ab0 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
14ac0 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
14ad0 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
14ae0 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
14af0 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
14b00 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
14b10 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
14b20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
14b30 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
14b40 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
14b50 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
14b60 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
14b70 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
14b80 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
14b90 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
14ba0 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
14bb0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
14bc0 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
14bd0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
14be0 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
14bf0 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
14c00 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
14c10 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
14c20 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
14c30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14c40 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
14c50 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
14c60 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
14c70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
14c80 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
14c90 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
14ca0 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
14cb0 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
14cc0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
14cd0 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
14ce0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14cf0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14d00 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
14d10 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
14d20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14d30 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
14d40 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
14d50 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
14d60 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
14d70 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14d90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
14da0 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
14db0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
14dc0 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
14dd0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14de0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
14df0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
14e00 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
14e10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
14e20 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
14e30 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
14e40 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
14e50 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
14e60 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
14e70 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
14e80 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
14e90 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
14ea0 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
14eb0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
14ec0 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
14ed0 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
14ee0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
14ef0 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
14f00 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
14f10 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
14f20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
14f30 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
14f40 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
14f50 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
14f60 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
14f70 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
14f80 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
14f90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14fa0 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
14fb0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
14fc0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
14fd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14fe0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
14ff0 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
15000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15020 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
15030 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
15040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15050 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
15060 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15070 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
15080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15090 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
150a0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
150b0 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
150c0 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
150d0 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
150e0 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
150f0 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
15100 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
15110 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
15120 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
15130 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
15140 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
15150 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
15160 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
15170 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
15180 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
15190 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
151a0 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
151b0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
151c0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
151d0 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
151e0 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
151f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15200 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
15210 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
15220 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
15230 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
15240 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
15250 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
15260 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
15270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
15290 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
152a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
152b0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
152c0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
152d0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
152e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
152f0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
15300 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
15310 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
15320 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
15330 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15340 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
15350 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
15360 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15370 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
15380 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
15390 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
153a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
153b0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
153c0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
153d0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
153e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
153f0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
15400 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
15410 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
15420 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
15430 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15440 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
15450 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
15460 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
15470 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
15480 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
15490 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
154a0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
154b0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
154c0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
154d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
154e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
154f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
15500 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
15510 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
15520 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
15530 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
15540 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
15550 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
15560 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
15570 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
15580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
15590 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
155a0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
155b0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
155c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
155d0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
155e0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
155f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
15600 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
15610 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
15620 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
15630 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
15640 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
15650 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
15660 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
15670 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
15680 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
15690 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
156a0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
156b0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
156c0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
156d0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
156e0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
156f0 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
15700 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
15710 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
15720 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
15730 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
15740 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
15750 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
15760 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
15770 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
15780 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
15790 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
157a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
157b0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
157c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
157d0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
157e0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
157f0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
15800 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
15810 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
15820 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
15830 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
15840 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
15850 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
15860 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
15870 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
15880 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
15890 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
158a0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
158b0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
158c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
158d0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
158e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
158f0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
15900 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
15910 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
15920 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
15930 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
15940 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
15950 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
15960 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
15970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
15980 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
15990 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
159a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
159b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
159c0 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
159d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
159e0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
159f0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
15a00 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
15a10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
15a20 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
15a30 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
15a40 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
15a50 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
15a60 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
15a70 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
15a80 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
15a90 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
15aa0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
15ab0 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
15ac0 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
15ad0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
15ae0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
15af0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
15b00 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
15b10 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
15b20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
15b30 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
15b40 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
15b50 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
15b60 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
15b70 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
15b80 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
15b90 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
15ba0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64  Cnt(db);.  if( d
15bb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15bc0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
15bd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
15be0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15bf0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
15c00 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72  lag is set to tr
15c10 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63  ue, then any loc
15c20 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c  ks that were hel
15c30 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63  d.  ** by connec
15c40 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77  tion db have now
15c50 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20   been released. 
15c60 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e  Call sqlite3Conn
15c70 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29  ectionUnlocked()
15c80 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65   .  ** to invoke
15c90 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e   any required un
15ca0 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
15cb0 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  backs..  */.  if
15cc0 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
15cd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
15ce0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
15cf0 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  d(db);.  }..  as
15d00 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
15d10 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61  ctive>0 || db->a
15d20 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
15d30 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
15d40 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
15d50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
15d60 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
15d70 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
15d80 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
15d90 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
15da0 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
15db0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
15dc0 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
15dd0 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
15de0 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
15df0 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
15e00 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
15e10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
15e20 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
15e30 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
15e40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15e50 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72  .** Copy the err
15e60 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
15e70 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67  r message belong
15e80 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20  ing to the VDBE 
15e90 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
15ea0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
15eb0 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20  to its database 
15ec0 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20  handle (so that 
15ed0 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  they will be .**
15ee0 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c   returned by cal
15ef0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  ls to sqlite3_er
15f00 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69  rcode() and sqli
15f10 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a  te3_errmsg())..*
15f20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
15f30 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61  on does not clea
15f40 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72  r the VDBE error
15f50 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65   code or message
15f60 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73  , just.** copies
15f70 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74   them to the dat
15f80 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
15f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
15fa0 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64  TransferError(Vd
15fb0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
15fc0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
15fd0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
15fe0 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73  .  if( p->zErrMs
15ff0 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65  g ){.    db->bBe
16000 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20  nignMalloc++;.  
16010 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
16020 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
16030 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d    if( db->pErr==
16040 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73  0 ) db->pErr = s
16050 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
16060 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
16070 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
16080 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
16090 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
160a0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
160b0 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
160c0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
160d0 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  );.    db->bBeni
160e0 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65  gnMalloc--;.  }e
160f0 6c 73 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72  lse if( db->pErr
16100 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16110 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e  alueSetNull(db->
16120 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  pErr);.  }.  db-
16130 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
16140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16160 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
16170 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f   If an SQLITE_CO
16180 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b  NFIG_SQLLOG hook
16190 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
161a0 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  nd the VM has be
161b0 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f  en run, .** invo
161c0 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ke it..*/.static
161d0 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65   void vdbeInvoke
161e0 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b  Sqllog(Vdbe *v){
161f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
16200 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
16210 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c  og && v->rc==SQL
16220 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71  ITE_OK && v->zSq
16230 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b  l && v->pc>=0 ){
16240 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61  .    char *zExpa
16250 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  nded = sqlite3Vd
16260 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76  beExpandSql(v, v
16270 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73  ->zSql);.    ass
16280 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74  ert( v->db->init
16290 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
162a0 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b  if( zExpanded ){
162b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
162c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
162d0 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71  og(.          sq
162e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
162f0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d  g.pSqllogArg, v-
16300 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20  >db, zExpanded, 
16310 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  1.      );.     
16320 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
16330 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29  ->db, zExpanded)
16340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
16350 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
16360 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29  eInvokeSqllog(x)
16370 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
16380 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
16390 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
163a0 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
163b0 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
163c0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
163d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
163e0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
163f0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
16400 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
16410 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
16420 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
16430 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
16440 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
16450 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
16460 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
16470 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
16480 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
16490 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
164a0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
164b0 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
164c0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
164d0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
164e0 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
164f0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
16500 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
16510 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65  Vdbe *p){.#if de
16520 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
16530 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
16540 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69  DBE_PROFILE).  i
16550 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt i;.#endif..  
16560 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
16570 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
16580 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
16590 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
165a0 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
165b0 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
165c0 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
165d0 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
165e0 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
165f0 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
16600 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
16610 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
16620 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
16630 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
16640 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
16650 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
16660 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
16670 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
16680 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
16690 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
166a0 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
166b0 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
166c0 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
166d0 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
166e0 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
166f0 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
16700 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
16710 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
16720 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
16730 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
16740 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
16750 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
16760 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
16770 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
16780 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
16790 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
167a0 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  r(p);.    if( p-
167b0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
167c0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
167d0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
167e0 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
167f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
16800 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
16810 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
16820 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
16830 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
16840 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
16850 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
16860 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
16870 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
16880 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
16890 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
168a0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
168b0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
168c0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
168d0 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
168e0 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
168f0 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
16900 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  );.  }..  /* Res
16910 65 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  et register cont
16920 65 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d  ents and reclaim
16930 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
16940 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64  emory..  */.#ifd
16950 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
16960 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
16970 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
16980 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
16990 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
169a0 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
169b0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
169c0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
169d0 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
169e0 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
169f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
16a00 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
16a10 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
16a20 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
16a30 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
16a40 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
16a50 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
16a60 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
16a70 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
16a80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
16a90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16aa0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
16ab0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
16ac0 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
16ad0 30 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  0;..  /* Save pr
16ae0 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
16af0 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
16b00 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
16b10 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
16b20 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
16b30 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
16b40 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
16b50 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
16b60 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
16b70 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
16b80 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16b90 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
16ba0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
16bb0 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
16bc0 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
16bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
16be0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
16bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a  ;.      if( p->z
16c00 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Sql ){.        c
16c10 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20  har c, pc = 0;. 
16c20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
16c30 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
16c40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
16c50 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30  = p->zSql[i])!=0
16c60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16c70 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29    if( pc=='\n' )
16c80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
16c90 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  - ");.          
16ca0 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
16cb0 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a          pc = c;.
16cc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16cd0 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29    if( pc!='\n' )
16ce0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
16cf0 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
16d00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
16d10 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
16d20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30      char zHdr[10
16d30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0];.        sqli
16d40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
16d50 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c  eof(zHdr), zHdr,
16d60 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c   "%6u %12llu %8l
16d70 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lu ",.          
16d80 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
16d90 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
16da0 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
16db0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
16dc0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
16dd0 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
16de0 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
16df0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16e00 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
16e10 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20  ", zHdr);.      
16e20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
16e30 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
16e40 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
16e50 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
16e60 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
16e70 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
16e80 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 45   = VDBE_MAGIC_RE
16e90 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  SET;.  return p-
16ea0 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
16eb0 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
16ec0 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
16ed0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
16ee0 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
16ef0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
16f00 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
16f10 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
16f20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
16f30 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
16f40 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
16f50 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
16f60 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
16f70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16f80 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
16f90 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
16fa0 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
16fb0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
16fc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16fd0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
16fe0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
16ff0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
17000 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
17010 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
17020 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
17040 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
17050 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
17060 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
17070 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
17080 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
17090 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
170a0 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
170b0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
170c0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
170d0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
170e0 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
170f0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
17100 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
17110 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
17120 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
17130 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
17140 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
17150 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
17160 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
17170 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
17180 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
17190 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
171a0 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
171b0 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
171c0 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
171d0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
171e0 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
171f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
17200 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
17210 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
17220 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
17230 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
17240 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
17250 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
17260 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
17270 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
17280 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
17290 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
172a0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62  corresponds to b
172b0 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
172c0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
172d0 65 6c 65 74 65 41 75 78 44 61 74 61 28 73 71 6c  eleteAuxData(sql
172e0 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61 74  ite3 *db, AuxDat
172f0 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c  a **pp, int iOp,
17300 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68   int mask){.  wh
17310 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20  ile( *pp ){.    
17320 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
17330 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f  *pp;.    if( (iO
17340 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41  p<0).     || (pA
17350 75 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 0a  ux->iAuxOp==iOp.
17360 20 20 20 20 20 20 20 20 20 20 26 26 20 70 41 75            && pAu
17370 78 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20 20  x->iAuxArg>=0.  
17380 20 20 20 20 20 20 20 20 26 26 20 28 70 41 75 78          && (pAux
17390 2d 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c 20  ->iAuxArg>31 || 
173a0 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
173b0 33 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67  32(pAux->iAuxArg
173c0 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
173d0 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78    testcase( pAux
173e0 2d 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29 3b  ->iAuxArg==31 );
173f0 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
17400 3e 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a 20  >xDeleteAux ){. 
17410 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
17420 6c 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70 41  leteAux(pAux->pA
17430 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
17440 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70     *pp = pAux->p
17450 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20 73  NextAux;.      s
17460 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17470 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73   pAux);.    }els
17480 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41  e{.      pp= &pA
17490 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20  ux->pNextAux;.  
174a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
174b0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
174c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
174d0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
174e0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
174f0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65  rgument,.** exce
17500 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74  pt for object it
17510 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70  self, which is p
17520 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
17530 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
17540 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
17550 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
17560 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
17570 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
17580 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
17590 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
175a0 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
175b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
175c0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
175d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66  connection and f
175e0 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20  rees the object 
175f0 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20  itself..*/.void 
17600 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
17610 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
17620 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
17630 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
17640 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  , *pNext;.  asse
17650 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
17660 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
17670 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
17680 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
17690 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
176a0 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
176b0 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
176c0 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
176d0 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
176e0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
176f0 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
17700 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
17710 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
17720 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17730 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sub);.  }.  if( 
17740 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
17750 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20  AGIC_INIT ){.   
17760 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
17770 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
17780 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
17790 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56 4c  bFree(db, p->pVL
177a0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
177b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
177c0 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64 62  Free);.  }.  vdb
177d0 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
177e0 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
177f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
17800 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
17810 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
17820 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
17830 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17840 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
17850 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69  STATUS.  {.    i
17860 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
17870 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69  0; i<p->nScan; i
17880 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
17890 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
178a0 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  aScan[i].zName);
178b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
178c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
178d0 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  aScan);.  }.#end
178e0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
178f0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
17900 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
17910 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
17920 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
17930 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   *db;..  assert(
17940 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
17950 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
17960 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17970 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
17980 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
17990 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
179a0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
179b0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
179c0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
179d0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
179e0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
179f0 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
17a00 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
17a10 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
17a20 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
17a30 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
17a40 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
17a50 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
17a60 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
17a70 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
17a80 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
17a90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
17aa0 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61  cursor "p" has a
17ab0 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70   pending seek op
17ac0 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73  eration that has
17ad0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a   not yet been.**
17ae0 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53   carried out.  S
17af0 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e  eek the cursor n
17b00 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  ow.  If an error
17b10 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a   occurs, return.
17b20 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
17b30 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
17b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
17b50 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
17b60 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
17b70 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
17b80 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b  {.  int res, rc;
17b90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
17ba0 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  EST.  extern int
17bb0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
17bc0 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
17bd0 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72  assert( p->defer
17be0 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61  redMoveto );.  a
17bf0 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
17c00 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
17c10 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
17c20 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72  YPE_BTREE );.  r
17c30 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
17c40 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
17c50 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c  ->uc.pCursor, 0,
17c60 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
17c70 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  , 0, &res);.  if
17c80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
17c90 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29  ;.  if( res!=0 )
17ca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17cb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66  ORRUPT_BKPT;.#if
17cc0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
17cd0 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
17ce0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
17cf0 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  .  p->deferredMo
17d00 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  veto = 0;.  p->c
17d10 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
17d20 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75  HE_STALE;.  retu
17d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17d40 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67  ./*.** Something
17d50 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f   has moved curso
17d60 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61  r "p" out of pla
17d70 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72  ce.  Maybe the r
17d80 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69  ow it was.** poi
17d90 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65  nted to was dele
17da0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
17db0 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65  er it.  Or maybe
17dc0 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a   the btree was.*
17dd0 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57  * rebalanced.  W
17de0 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73  hatever the caus
17df0 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72  e, try to restor
17e00 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61  e "p" to the pla
17e10 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70  ce it.** is supp
17e20 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  osed to be point
17e30 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77  ing.  If the row
17e40 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
17e50 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a   from under the.
17e60 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74  ** cursor, set t
17e70 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
17e80 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77  nt to a NULL row
17e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17ea0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
17eb0 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
17ec0 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  r(VdbeCursor *p)
17ed0 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72  {.  int isDiffer
17ee0 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73  entRow, rc;.  as
17ef0 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
17f00 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
17f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
17f20 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
17f30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17f40 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
17f50 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
17f60 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  rsor) );.  rc = 
17f70 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17f80 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e  orRestore(p->uc.
17f90 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66  pCursor, &isDiff
17fa0 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e  erentRow);.  p->
17fb0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
17fc0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
17fd0 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20   isDifferentRow 
17fe0 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
17ff0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18000 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
18010 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
18020 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
18030 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  .  Restore the c
18040 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64  ursor.** if need
18050 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79   be.  Return any
18060 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20   I/O error from 
18070 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72  the restore oper
18080 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
18090 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52  lite3VdbeCursorR
180a0 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f  estore(VdbeCurso
180b0 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
180c0 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
180d0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
180e0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
180f0 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
18100 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
18110 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
18120 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
18130 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18150 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
18160 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
18170 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
18180 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
18190 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
181a0 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
181b0 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
181c0 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
181d0 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
181e0 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
181f0 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
18200 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
18210 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
18220 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
18230 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
18240 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
18250 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
18260 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
18270 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
18280 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
18290 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
182a0 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
182b0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
182c0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
182d0 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
182e0 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
182f0 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
18300 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
18310 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
18320 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
18330 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
18340 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
18350 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
18360 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
18370 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
18380 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
18390 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
183a0 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
183b0 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
183c0 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
183d0 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29  *pp, int *piCol)
183e0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
183f0 70 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72  p = *pp;.  asser
18400 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
18410 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c  CURTYPE_BTREE ||
18420 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
18430 52 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a  RTYPE_PSEUDO );.
18440 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
18450 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
18460 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28  nt iMap;.    if(
18470 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28   p->aAltMap && (
18480 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61  iMap = p->aAltMa
18490 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29  p[1+*piCol])>0 )
184a0 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  {.      *pp = p-
184b0 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20  >pAltCursor;.   
184c0 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70     *piCol = iMap
184d0 20 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   - 1;.      retu
184e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
184f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68    }.    return h
18500 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
18510 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66  eto(p);.  }.  if
18520 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
18530 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
18540 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
18550 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
18560 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
18570 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
18580 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18590 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
185a0 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
185b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
185c0 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
185d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
185e0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
185f0 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
18600 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
18610 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
18620 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
18630 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
18640 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
18650 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
18660 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
18670 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
18680 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
18690 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
186a0 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
186b0 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
186c0 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
186d0 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
186e0 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
186f0 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
18700 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
18710 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
18720 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
18730 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
18740 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
18750 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
18760 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
18770 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
18780 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
18790 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
187a0 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
187b0 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
187c0 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
187d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
187e0 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
187f0 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
18800 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
18810 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
18820 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
18830 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
18840 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
18850 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
18860 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
18870 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
18880 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
18890 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
188a0 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
188b0 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
188c0 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
188d0 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
188e0 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
188f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
18900 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
18910 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
18920 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
18950 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
18980 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
18990 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
189b0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
189c0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
189d0 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
189e0 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
189f0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
18a00 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
18a30 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
18a40 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
18a50 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
18a60 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
18a70 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
18a80 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
18a90 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
18aa0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
18ab0 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ad0 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
18ae0 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
18af0 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
18b00 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
18b10 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
18b20 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b40 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
18b50 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
18b60 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
18b90 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
18ba0 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
18bb0 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
18bc0 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
18bd0 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
18be0 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
18bf0 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
18c00 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
18c10 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
18c20 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
18c30 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
18c40 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
18c50 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
18c60 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
18c70 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
18c80 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
18c90 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
18ca0 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
18cb0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
18cc0 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
18cd0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
18ce0 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
18cf0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75  t file_format, u
18d00 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74  32 *pLen){.  int
18d10 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
18d20 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  lags;.  u32 n;..
18d30 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d    assert( pLen!=
18d40 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  0 );.  if( flags
18d50 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
18d60 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20   *pLen = 0;.    
18d70 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
18d80 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
18d90 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
18da0 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
18db0 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
18dc0 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
18dd0 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
18de0 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
18df0 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
18e00 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
18e10 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
18e20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29  u;.    if( i<0 )
18e30 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a  {.      u = ~i;.
18e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18e50 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
18e60 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a    if( u<=127 ){.
18e70 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d        if( (i&1)=
18e80 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61  =i && file_forma
18e90 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  t>=4 ){.        
18ea0 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  *pLen = 0;.     
18eb0 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32     return 8+(u32
18ec0 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )u;.      }else{
18ed0 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d  .        *pLen =
18ee0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
18ef0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
18f00 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33    }.    if( u<=3
18f10 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  2767 ){ *pLen = 
18f20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20  2; return 2; }. 
18f30 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
18f40 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20  7 ){ *pLen = 3; 
18f50 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20  return 3; }.    
18f60 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
18f70 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20  7 ){ *pLen = 4; 
18f80 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20  return 4; }.    
18f90 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
18fa0 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72   ){ *pLen = 6; r
18fb0 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a  eturn 5; }.    *
18fc0 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65  pLen = 8;.    re
18fd0 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
18fe0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
18ff0 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
19000 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  8;.    return 7;
19010 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19020 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
19030 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
19040 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
19050 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
19060 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e  Mem->n>=0 );.  n
19070 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b   = (u32)pMem->n;
19080 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
19090 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
190a0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
190b0 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d  o;.  }.  *pLen =
190c0 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   n;.  return ((n
190d0 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
190e0 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
190f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
19100 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20  izes for serial 
19110 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20  types less than 
19120 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  128.*/.static co
19130 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d  nst u8 sqlite3Sm
19140 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d  allTypeSizes[] =
19150 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30   {.        /*  0
19160 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34     1   2   3   4
19170 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38     5   6   7   8
19180 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20     9 */   ./*   
19190 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32  0 */   0,  1,  2
191a0 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38  ,  3,  4,  6,  8
191b0 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  8,  0,  0,./*
191c0 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c    10 */   0,  0,
191d0 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
191e0 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c    2,  2,  3,  3,
191f0 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20  ./*  20 */   4, 
19200 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20   4,  5,  5,  6, 
19210 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20   6,  7,  7,  8, 
19220 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20   8,./*  30 */   
19230 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31  9,  9, 10, 10, 1
19240 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31  1, 11, 12, 12, 1
19250 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f  3, 13,./*  40 */
19260 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35    14, 14, 15, 15
19270 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37  , 16, 16, 17, 17
19280 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30  , 18, 18,./*  50
19290 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c   */  19, 19, 20,
192a0 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c   20, 21, 21, 22,
192b0 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20   22, 23, 23,./* 
192c0 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20   60 */  24, 24, 
192d0 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20  25, 25, 26, 26, 
192e0 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a  27, 27, 28, 28,.
192f0 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32  /*  70 */  29, 2
19300 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33  9, 30, 30, 31, 3
19310 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33  1, 32, 32, 33, 3
19320 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34  3,./*  80 */  34
19330 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36  , 34, 35, 35, 36
19340 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38  , 36, 37, 37, 38
19350 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20  , 38,./*  90 */ 
19360 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c   39, 39, 40, 40,
19370 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c   41, 41, 42, 42,
19380 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20   43, 43,./* 100 
19390 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20  */  44, 44, 45, 
193a0 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20  45, 46, 46, 47, 
193b0 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31  47, 48, 48,./* 1
193c0 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35  10 */  49, 49, 5
193d0 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35  0, 50, 51, 51, 5
193e0 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f  2, 52, 53, 53,./
193f0 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34  * 120 */  54, 54
19400 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36  , 55, 55, 56, 56
19410 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a  , 57, 57.};../*.
19420 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
19430 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
19440 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
19450 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
19460 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
19470 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
19480 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
19490 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
194a0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
194b0 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75  =128 ){.    retu
194c0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
194d0 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
194e0 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69      assert( seri
194f0 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20  al_type<12 .    
19500 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
19510 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
19520 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28  [serial_type]==(
19530 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
19540 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72  )/2 );.    retur
19550 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
19560 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
19570 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73  ype];.  }.}.u8 s
19580 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74  qlite3VdbeOneByt
19590 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
195a0 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  8 serial_type){.
195b0 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
195c0 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72  _type<128 );.  r
195d0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
195e0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
195f0 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f  al_type];  .}../
19600 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
19610 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
19620 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
19630 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
19640 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
19650 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
19660 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
19670 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
19680 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
19690 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
196a0 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
196b0 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
196c0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
196d0 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
196e0 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
196f0 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
19700 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
19710 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
19720 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
19730 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
19740 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
19750 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
19760 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
19770 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
19780 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
19790 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
197a0 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
197b0 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
197c0 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
197d0 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
197e0 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
197f0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
19800 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
19810 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
19820 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
19830 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
19840 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
19850 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
19860 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
19870 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
19880 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
19890 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
198a0 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
198b0 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
198c0 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
198d0 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
198e0 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
198f0 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
19900 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
19910 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
19920 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
19930 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
19940 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
19950 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
19960 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
19970 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
19980 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
19990 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
199a0 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
199b0 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
199c0 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
199d0 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
199e0 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
199f0 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
19a00 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
19a10 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
19a20 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
19a30 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
19a40 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
19a50 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
19a60 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
19a70 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
19a80 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
19a90 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
19aa0 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
19ab0 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
19ac0 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
19ad0 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
19ae0 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
19af0 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
19b00 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
19b10 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
19b20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
19b30 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
19b40 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
19b50 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
19b60 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
19b70 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
19b80 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
19b90 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
19ba0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
19bb0 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
19bc0 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
19bd0 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
19be0 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
19bf0 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
19c00 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
19c10 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
19c20 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
19c30 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
19c40 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
19c50 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
19c60 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
19c70 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
19c80 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
19c90 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
19ca0 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
19cb0 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
19cc0 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
19cd0 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
19ce0 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
19cf0 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
19d00 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
19d10 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
19d20 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
19d30 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
19d40 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
19d50 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
19d60 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
19d70 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
19d80 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
19d90 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19da0 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
19db0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
19dc0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
19dd0 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
19de0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
19df0 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
19e00 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
19e10 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
19e20 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
19e30 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
19e40 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19e50 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
19e60 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
19e70 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
19e80 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
19e90 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
19ea0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
19eb0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
19ec0 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
19ed0 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
19ee0 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
19ef0 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
19f00 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
19f10 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
19f20 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
19f30 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
19f40 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19f50 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
19f60 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
19f70 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
19f80 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
19f90 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
19fa0 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
19fb0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
19fc0 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
19fd0 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
19fe0 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
19ff0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1a000 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
1a010 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
1a020 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
1a030 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
1a040 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
1a050 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
1a060 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
1a070 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
1a080 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
1a090 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
1a0a0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1a0b0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
1a0c0 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
1a0d0 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
1a0e0 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
1a0f0 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
1a100 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
1a110 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
1a120 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a130 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
1a140 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
1a150 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d   = i = sqlite3Sm
1a160 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
1a170 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61  ial_type];.    a
1a180 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
1a190 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b    do{.      buf[
1a1a0 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  --i] = (u8)(v&0x
1a1b0 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
1a1c0 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   8;.    }while( 
1a1d0 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  i );.    return 
1a1e0 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
1a1f0 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
1a200 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
1a210 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
1a220 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
1a230 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
1a240 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
1a250 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20  u.nZero:0).     
1a260 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29          == (int)
1a270 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1a280 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1a290 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e  type) );.    len
1a2a0 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
1a2b0 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63  if( len>0 ) memc
1a2c0 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
1a2d0 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
1a2e0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
1a2f0 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
1a300 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
1a310 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49  eturn 0;.}../* I
1a320 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65  nput "x" is a se
1a330 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e  quence of unsign
1a340 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ed characters th
1a350 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a  at represent a.*
1a360 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  * big-endian int
1a370 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  eger.  Return th
1a380 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74  e equivalent nat
1a390 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23  ive integer.*/.#
1a3a0 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f  define ONE_BYTE_
1a3b0 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28  INT(x)    ((i8)(
1a3c0 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[0]).#define T
1a3d0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  WO_BYTE_INT(x)  
1a3e0 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b    (256*(i8)((x)[
1a3f0 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66  0])|(x)[1]).#def
1a400 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49  ine THREE_BYTE_I
1a410 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69  NT(x)  (65536*(i
1a420 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
1a430 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23  1]<<8)|(x)[2]).#
1a440 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
1a450 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32  _UINT(x)  (((u32
1a460 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78  )(x)[0]<<24)|((x
1a470 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
1a480 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64  ]<<8)|(x)[3]).#d
1a490 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
1a4a0 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36  INT(x) (16777216
1a4b0 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
1a4c0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
1a4d0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a  2]<<8)|(x)[3])..
1a4e0 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
1a4f0 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
1a500 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
1a510 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
1a520 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
1a530 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1a540 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
1a550 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1a560 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
1a570 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1a580 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1a590 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61  ed as two separa
1a5a0 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  te routines for 
1a5b0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
1a5c0 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68  The few cases th
1a5d0 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c  at require local
1a5e0 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
1a5f0 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61  roken out into a
1a600 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75   separate.** rou
1a610 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20  tine so that in 
1a620 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f  most cases the o
1a630 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e  verhead of movin
1a640 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e  g the stack poin
1a650 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65  ter.** is avoide
1a660 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33  d..*/ .static u3
1a670 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  2 SQLITE_NOINLIN
1a680 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63  E serialGet(.  c
1a690 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a6a0 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
1a6b0 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
1a6c0 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
1a6d0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a6f0 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
1a700 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
1a710 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
1a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a730 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
1a740 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
1a750 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20  o */.){.  u64 x 
1a760 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1a770 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d  (buf);.  u32 y =
1a780 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1a790 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78  buf+4);.  x = (x
1a7a0 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28  <<32) + y;.  if(
1a7b0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
1a7c0 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
1a7d0 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35  CE-OF: R-29851-5
1a7e0 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20  2272 Value is a 
1a7f0 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69  big-endian 64-bi
1a800 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f  t.    ** twos-co
1a810 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1a820 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  . */.    pMem->u
1a830 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
1a840 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a850 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
1a860 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a870 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
1a880 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1a890 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31  -OF: R-57343-491
1a8a0 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  14 Value is a bi
1a8b0 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35  g-endian IEEE 75
1a8c0 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20  4-2008 64-bit.  
1a8d0 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
1a8e0 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23  int number. */.#
1a8f0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
1a900 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
1a910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1a920 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
1a930 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
1a940 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
1a950 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1a960 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
1a970 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
1a980 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
1a990 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
1a9a0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
1a9b0 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64  s.    ** defined
1a9c0 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
1a9d0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
1a9e0 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
1a9f0 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61  xed.    ** endia
1aa00 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n..    */.    st
1aa10 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
1aa20 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
1aa30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73  0000)<<32;.    s
1aa40 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
1aa50 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
1aa60 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
1aa70 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
1aa80 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
1aa90 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
1aaa0 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
1aab0 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
1aac0 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
1aad0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 );.#endif.    
1aae0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
1aaf0 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
1ab00 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a  Mem->u.r)==8 );.
1ab10 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1ab20 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
1ab30 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75   memcpy(&pMem->u
1ab40 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  .r, &x, sizeof(x
1ab50 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ));.    pMem->fl
1ab60 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
1ab70 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20  aN(pMem->u.r) ? 
1ab80 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
1ab90 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eal;.  }.  retur
1aba0 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  n 8;.}.u32 sqlit
1abb0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1abc0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1abd0 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
1abe0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
1abf0 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
1ac00 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
1ac10 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1ac20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1ac30 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1ac40 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
1ac70 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
1ac80 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
1ac90 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1aca0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
1acb0 3a 20 7b 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20  : { /* Internal 
1acc0 75 73 65 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77  use only: NULL w
1acd0 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
1ace0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1acf0 20 2a 2a 20 55 50 44 41 54 45 20 6e 6f 2d 63 68   ** UPDATE no-ch
1ad00 61 6e 67 65 20 66 6c 61 67 20 73 65 74 20 2a 2f  ange flag set */
1ad10 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1ad20 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  gs = MEM_Null|ME
1ad30 4d 5f 5a 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d  M_Zero;.      pM
1ad40 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
1ad50 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d   pMem->u.nZero =
1ad60 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1ad70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ad80 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
1ad90 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
1ada0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
1adb0 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20  {  /* Null */.  
1adc0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1add0 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37  OF: R-24078-0937
1ade0 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c  5 Value is a NUL
1adf0 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  L. */.      pMem
1ae00 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
1ae10 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
1ae20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ae30 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  1: {.      /* EV
1ae40 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38  IDENCE-OF: R-448
1ae50 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69  85-25196 Value i
1ae60 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d  s an 8-bit twos-
1ae70 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20  complement.     
1ae80 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
1ae90 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1aea0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
1aeb0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1aec0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1aed0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1aee0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1aef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1af00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1af10 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
1af20 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1af30 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1af40 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33  CE-OF: R-49794-3
1af50 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20  5026 Value is a 
1af60 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69  big-endian 16-bi
1af70 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1af80 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1af90 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1afa0 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
1afb0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1afc0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1afd0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1afe0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1aff0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1b000 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1b010 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1b020 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1b030 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1b040 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1b050 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75  37839-54301 Valu
1b060 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1b070 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 24-bit.      *
1b080 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1b090 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1b0a0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1b0b0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
1b0c0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1b0d0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1b0e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b0f0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1b100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
1b110 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b120 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
1b130 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1b140 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1b150 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32  CE-OF: R-01849-2
1b160 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20  6079 Value is a 
1b170 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69  big-endian 32-bi
1b180 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1b190 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1b1a0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1b1b0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
1b1c0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66  TE_INT(buf);.#if
1b1d0 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20  def __HP_cc .   
1b1e0 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e     /* Work aroun
1b1f0 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69  d a sign-extensi
1b200 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50  on bug in the HP
1b210 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50   compiler for HP
1b220 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  /UX */.      if(
1b230 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70   buf[0]&0x80 ) p
1b240 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66  Mem->u.i |= 0xff
1b250 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c  ffffff80000000LL
1b260 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
1b270 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1b280 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1b290 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1b2a0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1b2b0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
1b2c0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1b2d0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1b2e0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1b2f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33  IDENCE-OF: R-503
1b300 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69  85-09674 Value i
1b310 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34  s a big-endian 4
1b320 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  8-bit.      ** t
1b330 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1b340 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1b350 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
1b360 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
1b370 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1b380 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1b390 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1b3a0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1b3b0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1b3c0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1b3d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b3e0 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
1b3f0 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
1b400 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1b410 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
1b420 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
1b430 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
1b440 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f   /* These use lo
1b450 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73  cal variables, s
1b460 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73  o do them in a s
1b470 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a  eparate routine.
1b480 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
1b490 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65  d having to move
1b4a0 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74   the frame point
1b4b0 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  er in the common
1b4c0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72   case */.      r
1b4d0 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28  eturn serialGet(
1b4e0 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c  buf,serial_type,
1b4f0 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
1b500 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
1b510 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
1b520 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
1b530 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
1b540 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b550 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56   R-12976-22893 V
1b560 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
1b570 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 0. */.      
1b580 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1b590 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61  R-18143-12121 Va
1b5a0 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1b5b0 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70  er 1. */.      p
1b5c0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
1b5d0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
1b5e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1b5f0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
1b600 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1b610 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1b620 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1b630 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20  : R-14606-31564 
1b640 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20  Value is a BLOB 
1b650 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32  that is (N-12)/2
1b660 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20   bytes in.      
1b670 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20  ** length..     
1b680 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
1b690 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56   R-28401-00140 V
1b6a0 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1b6b0 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63   in the text enc
1b6c0 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  oding and.      
1b6d0 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65  ** (N-13)/2 byte
1b6e0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a  s in length. */.
1b6f0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
1b700 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
1b710 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
1b720 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
1b730 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
1b740 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
1b750 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
1b760 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
1b770 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
1b780 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1b790 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
1b7a0 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
1b7b0 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
1b7c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b7d0 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
1b7e0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1b7f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
1b800 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
1b810 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
1b820 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
1b830 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1b840 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
1b850 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1b860 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
1b870 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1b880 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1b890 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1b8a0 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
1b8b0 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
1b8c0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
1b8d0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
1b8e0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
1b8f0 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
1b900 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
1b910 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
1b920 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
1b930 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
1b940 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
1b950 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
1b960 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
1b970 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
1b980 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
1b990 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
1b9a0 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
1b9b0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
1b9c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
1b9d0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
1b9e0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
1b9f0 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
1ba00 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
1ba10 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1ba20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
1ba30 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1ba40 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
1ba50 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
1ba60 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1ba70 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1ba80 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
1ba90 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
1baa0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1bab0 6e 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  nfo             
1bac0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1bad0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
1bae0 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
1baf0 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
1bb00 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
1bb10 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
1bb20 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  urn */.  int nBy
1bb30 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1bb40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bb50 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
1bb60 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20  ired for *p */. 
1bb70 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
1bb80 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
1bb90 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
1bba0 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
1bbb0 3e 6e 4b 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20  >nKeyField+1);. 
1bbc0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
1bbd0 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
1bbe0 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
1bbf0 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
1bc00 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1bc10 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  n 0;.  p->aMem =
1bc20 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1bc30 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1bc40 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1bc50 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1bc60 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1bc70 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1bc80 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1bc90 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1bca0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
1bcb0 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75  ield + 1;.  retu
1bcc0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1bcd0 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
1bce0 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
1bcf0 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
1bd00 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ], populate the 
1bd10 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  .** UnpackedReco
1bd20 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  rd structure ind
1bd30 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f  icated by the fo
1bd40 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69  urth argument wi
1bd50 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  th the.** conten
1bd60 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65  ts of the decode
1bd70 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f  d record..*/ .vo
1bd80 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1bd90 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
1bda0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1bdb0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1bdc0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
1bdd0 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
1bde0 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
1bdf0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1be00 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
1be10 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
1be20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1be30 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
1be40 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
1be50 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20  kedRecord *p    
1be60 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1be70 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66  is structure bef
1be80 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
1be90 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
1bea0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1beb0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1bec0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
1bed0 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20    int d; .  u32 
1bee0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1bf00 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20  ffset in aKey[] 
1bf10 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1bf20 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1bf50 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1bf60 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
1bf70 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *pMem = p->aMem
1bf80 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f  ;..  p->default_
1bf90 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
1bfa0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1bfb0 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
1bfc0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1bfd0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1bfe0 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
1bff0 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
1c000 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c   idx<szHdr && d<
1c010 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
1c020 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1c030 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1c040 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
1c050 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1c060 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
1c070 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1c080 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
1c090 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1c0a0 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
1c0b0 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
1c0c0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
1c0d0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
1c0e0 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
1c0f0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
1c100 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20    pMem->z = 0;. 
1c110 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
1c120 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1c130 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
1c140 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
1c150 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28  Mem++;.    if( (
1c160 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20  ++u)>=p->nField 
1c170 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61  ) break;.  }.  a
1c180 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
1c190 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20  fo->nKeyField + 
1c1a0 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
1c1b0 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   = u;.}..#ifdef 
1c1c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1c1d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c1e0 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
1c1f0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
1c200 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
1c210 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
1c220 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1c230 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
1c240 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
1c250 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1c260 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1c270 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1c280 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
1c290 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
1c2a0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1c2b0 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
1c2c0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1c2d0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
1c2e0 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
1c2f0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1c300 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1c310 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
1c320 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
1c330 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1c340 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
1c350 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
1c360 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
1c370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1c380 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1c390 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
1c3a0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
1c3b0 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
1c3c0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1c3d0 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
1c3e0 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
1c3f0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1c400 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
1c410 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1c420 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1c430 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1c440 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1c450 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1c460 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1c470 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
1c480 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1c490 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
1c4a0 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1c4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1c4c0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1c4d0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1c4e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
1c4f0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
1c500 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1c510 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
1c520 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
1c530 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1c540 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c550 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
1c560 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
1c570 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1c580 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1c590 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1c5a0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c5b0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
1c5c0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1c5d0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
1c5e0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1c5f0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
1c600 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1c610 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1c620 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1c630 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
1c640 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1c650 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
1c660 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
1c670 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
1c680 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
1c690 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
1c6a0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1c6b0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1c6c0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1c6d0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1c6e0 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
1c6f0 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
1c700 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
1c710 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
1c720 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
1c730 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
1c740 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
1c750 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
1c760 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
1c770 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
1c780 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
1c790 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
1c7a0 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
1c7b0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
1c7c0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
1c7d0 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
1c7e0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
1c7f0 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
1c800 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
1c810 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
1c820 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
1c830 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
1c840 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
1c850 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
1c860 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
1c870 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1c880 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
1c890 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
1c8a0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1c8b0 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
1c8c0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
1c8d0 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
1c8e0 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
1c8f0 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
1c900 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1c910 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1c920 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33    if( szHdr1>983
1c930 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  07 ) return SQLI
1c940 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31  TE_CORRUPT;.  d1
1c950 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
1c960 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1c970 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  AllField>=pPKey2
1c980 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52  ->nField || CORR
1c990 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1c9a0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
1c9b0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
1c9c0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1c9d0 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29  o->nKeyField>0 )
1c9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1c9f0 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1ca00 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1ca10 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1ca20 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
1ca30 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
1ca40 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
1ca50 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
1ca60 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
1ca70 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
1ca80 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
1ca90 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
1caa0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
1cab0 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
1cac0 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
1cad0 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
1cae0 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
1caf0 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
1cb00 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1cb10 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
1cb20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
1cb30 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
1cb40 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1cb50 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
1cb60 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
1cb70 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
1cb80 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
1cb90 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
1cba0 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
1cbb0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
1cbc0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1cbd0 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
1cbe0 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
1cbf0 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
1cc00 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
1cc10 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
1cc20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1cc30 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1cc40 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
1cc50 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
1cc60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1cc70 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1cc80 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
1cc90 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
1cca0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1ccb0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1ccc0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1ccd0 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
1cce0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
1ccf0 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
1cd00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1cd10 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
1cd20 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
1cd30 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
1cd40 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
1cd50 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1cd60 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1cd70 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1cd80 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1cd90 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
1cda0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1cdb0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1cdc0 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
1cdd0 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
1cde0 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
1cdf0 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
1ce00 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65   }.      goto de
1ce10 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20  bugCompareEnd;. 
1ce20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
1ce30 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48  }while( idx1<szH
1ce40 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1ce50 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a  >nField );..  /*
1ce60 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1ce70 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1ce80 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1ce90 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1cea0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1ceb0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1cec0 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1ced0 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1cee0 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1cef0 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1cf00 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1cf10 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1cf20 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  1)..  */.  asser
1cf30 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1cf40 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1cf50 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1cf60 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
1cf70 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1cf80 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1cf90 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1cfa0 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1cfb0 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1cfc0 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1cfd0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1cfe0 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64    rc = pPKey2->d
1cff0 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75  efault_rc;..debu
1d000 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69  gCompareEnd:.  i
1d010 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1d020 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72  ==0 && rc==0 ) r
1d030 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
1d040 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26  esiredResult<0 &
1d050 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  & rc<0 ) return 
1d060 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1d070 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30  Result>0 && rc>0
1d080 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1d090 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1d0a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1d0b0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1d0c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1d0d0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
1d0e0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1d0f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d100 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1d110 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1d120 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1d130 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1d140 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1d150 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1d160 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1d170 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1d180 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1d190 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1d1a0 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  by pKeyInfo->nAl
1d1b0 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  lField..**.** If
1d1c0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1d1d0 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65   is not satisfie
1d1e0 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  d, it means that
1d1f0 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a   the high-speed.
1d200 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  ** vdbeRecordCom
1d210 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64  pareInt() and vd
1d220 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
1d230 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73  tring() routines
1d240 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72   will.** not wor
1d250 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66  k correctly.  If
1d260 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65   this assert() e
1d270 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72  ver fires, it pr
1d280 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20  obably means.** 
1d290 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f  that the KeyInfo
1d2a0 2e 6e 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b 65  .nKeyField or Ke
1d2b0 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20  yInfo.nAllField 
1d2c0 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70  values were comp
1d2d0 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63  uted.** incorrec
1d2e0 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tly..*/.static v
1d2f0 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69  oid vdbeAssertFi
1d300 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1d310 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79  mits(.  int nKey
1d320 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1d330 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63  ey,   /* The rec
1d340 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f  ord to verify */
1d350 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66   .  const KeyInf
1d360 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1d370 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a    /* Compare siz
1d380 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49  e with this KeyI
1d390 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nfo */.){.  int 
1d3a0 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33  nField = 0;.  u3
1d3b0 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69  2 szHdr;.  u32 i
1d3c0 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65  dx;.  u32 notUse
1d3d0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  d;.  const unsig
1d3e0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1d3f0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1d400 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20   char*)pKey;..  
1d410 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1d420 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d   return;.  idx =
1d430 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1d440 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73  y, szHdr);.  ass
1d450 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  ert( nKey>=0 );.
1d460 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c    assert( szHdr<
1d470 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20  =(u32)nKey );.  
1d480 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1d490 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67   ){.    idx += g
1d4a0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b  etVarint32(aKey+
1d4b0 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20  idx, notUsed);. 
1d4c0 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d     nField++;.  }
1d4d0 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c  .  assert( nFiel
1d4e0 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  d <= pKeyInfo->n
1d4f0 41 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65  AllField );.}.#e
1d500 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
1d510 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1d520 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c  tWithinLimits(A,
1d530 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B,C).#endif../*.
1d540 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61  ** Both *pMem1 a
1d550 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69  nd *pMem2 contai
1d560 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e  n string values.
1d570 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   Compare the two
1d580 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67   values.** using
1d590 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1d5a0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41  equence pColl. A
1d5b0 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20  s usual, return 
1d5c0 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72  a negative , zer
1d5d0 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1d5e0 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31   value if *pMem1
1d5f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1d600 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
1d610 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65  er than .** *pMe
1d620 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  m2, respectively
1d630 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69  . Similar in spi
1d640 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70  rit to "rc = (*p
1d650 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29  Mem1) - (*pMem2)
1d660 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ;"..*/.static in
1d670 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  t vdbeCompareMem
1d680 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20  String(.  const 
1d690 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f  Mem *pMem1,.  co
1d6a0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a  nst Mem *pMem2,.
1d6b0 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20    const CollSeq 
1d6c0 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72  *pColl,.  u8 *pr
1d6d0 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  cErr            
1d6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d6f0 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
1d700 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1d710 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  EM */.){.  if( p
1d720 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  Mem1->enc==pColl
1d730 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20  ->enc ){.    /* 
1d740 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20  The strings are 
1d750 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
1d760 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e  orrect encoding.
1d770 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20    Call the.     
1d780 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ** comparison fu
1d790 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  nction directly 
1d7a0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  */.    return pC
1d7b0 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1d7c0 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
1d7d0 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
1d7e0 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d  n,pMem2->z);.  }
1d7f0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
1d800 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
1d810 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d   *v1, *v2;.    M
1d820 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63  em c1;.    Mem c
1d830 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  2;.    sqlite3Vd
1d840 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70  beMemInit(&c1, p
1d850 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1d860 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1d870 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c  VdbeMemInit(&c2,
1d880 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1d890 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1d8a0 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1d8b0 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
1d8c0 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1d8d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1d8e0 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
1d8f0 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
1d900 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
1d910 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1d920 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
1d930 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1d940 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
1d950 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1d960 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
1d970 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69  oll->enc);.    i
1d980 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1d990 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =0) ){.      if(
1d9a0 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72   prcErr ) *prcEr
1d9b0 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  r = SQLITE_NOMEM
1d9c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20  _BKPT;.      rc 
1d9d0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1d9e0 20 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c        rc = pColl
1d9f0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1da00 73 65 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63  ser, c1.n, v1, c
1da10 32 2e 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a  2.n, v2);.    }.
1da20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1da30 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a  emRelease(&c1);.
1da40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1da50 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a  emRelease(&c2);.
1da60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1da70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
1da80 69 6e 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67  input pBlob is g
1da90 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1daa0 61 20 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e  a Blob that is n
1dab0 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74  ot marked.** wit
1dac0 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74  h MEM_Zero.  Ret
1dad0 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
1dae0 6f 75 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62  ould be a zero-b
1daf0 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lob..*/.static i
1db00 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e  nt isAllZero(con
1db10 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1db20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  n){.  int i;.  f
1db30 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
1db40 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20  ){.    if( z[i] 
1db50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1db60 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1db70 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
1db80 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20   blobs.  Return 
1db90 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1dba0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1dbb0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c  he first.** is l
1dbc0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1dbd0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1dbe0 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20  han the second, 
1dbf0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
1dc00 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20   If one blob is 
1dc10 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1dc20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20  other, then the 
1dc30 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c  shorter is the l
1dc40 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  essor..*/.static
1dc50 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1dc60 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62   int sqlite3Blob
1dc70 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1dc80 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65  m *pB1, const Me
1dc90 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63  m *pB2){.  int c
1dca0 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 70 42 31  ;.  int n1 = pB1
1dcb0 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20  ->n;.  int n2 = 
1dcc0 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74  pB2->n;..  /* It
1dcd0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1dce0 68 61 76 65 20 61 20 42 6c 6f 62 20 76 61 6c 75  have a Blob valu
1dcf0 65 20 74 68 61 74 20 68 61 73 20 73 6f 6d 65 20  e that has some 
1dd00 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74  non-zero content
1dd10 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
1dd20 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20  y zero content. 
1dd30 20 42 75 74 20 74 68 61 74 20 6f 6e 6c 79 20 63   But that only c
1dd40 6f 6d 65 73 20 75 70 20 66 6f 72 20 42 6c 6f 62  omes up for Blob
1dd50 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79  s formed.  ** by
1dd60 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1dd70 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73  rd opcode, and s
1dd80 75 63 68 20 42 6c 6f 62 73 20 6e 65 76 65 72 20  uch Blobs never 
1dd90 67 65 74 20 70 61 73 73 65 64 20 69 6e 74 6f 0a  get passed into.
1dda0 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43    ** sqlite3MemC
1ddb0 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61  ompare(). */.  a
1ddc0 73 73 65 72 74 28 20 28 70 42 31 2d 3e 66 6c 61  ssert( (pB1->fla
1ddd0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
1dde0 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20  0 || n1==0 );.  
1ddf0 61 73 73 65 72 74 28 20 28 70 42 32 2d 3e 66 6c  assert( (pB2->fl
1de00 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
1de10 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a  =0 || n2==0 );..
1de20 20 20 69 66 28 20 28 70 42 31 2d 3e 66 6c 61 67    if( (pB1->flag
1de30 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29 20 26 20  s|pB2->flags) & 
1de40 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
1de50 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26  if( pB1->flags &
1de60 20 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45   pB2->flags & ME
1de70 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
1de80 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a  return pB1->u.nZ
1de90 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65  ero - pB2->u.nZe
1dea0 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ro;.    }else if
1deb0 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d  ( pB1->flags & M
1dec0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
1ded0 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28   if( !isAllZero(
1dee0 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20  pB2->z, pB2->n) 
1def0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1df00 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75     return pB1->u
1df10 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20  .nZero - n2;.   
1df20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1df30 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31  ( !isAllZero(pB1
1df40 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72  ->z, pB1->n) ) r
1df50 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1df60 72 65 74 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d  return n1 - pB2-
1df70 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a  >u.nZero;.    }.
1df80 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70    }.  c = memcmp
1df90 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c  (pB1->z, pB2->z,
1dfa0 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31   n1>n2 ? n2 : n1
1dfb0 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65 74  );.  if( c ) ret
1dfc0 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20  urn c;.  return 
1dfd0 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n1 - n2;.}../*.*
1dfe0 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f  * Do a compariso
1dff0 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62  n between a 64-b
1e000 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
1e010 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66  r and a 64-bit f
1e020 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a  loating-point.**
1e030 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
1e040 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1e050 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1e060 74 68 65 20 66 69 72 73 74 20 28 69 36 34 29 20  the first (i64) 
1e070 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a  is less than,.**
1e080 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1e090 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
1e0a0 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a  econd (double)..
1e0b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1e0c0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1e0d0 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62  pare(i64 i, doub
1e0e0 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a  le r){.  if( siz
1e0f0 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54  eof(LONGDOUBLE_T
1e100 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f  YPE)>8 ){.    LO
1e110 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20  NGDOUBLE_TYPE x 
1e120 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59  = (LONGDOUBLE_TY
1e130 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c  PE)i;.    if( x<
1e140 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1e150 20 20 20 69 66 28 20 78 3e 72 20 29 20 72 65 74     if( x>r ) ret
1e160 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75  urn +1;.    retu
1e170 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
1e180 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f     i64 y;.    do
1e190 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20  uble s;.    if( 
1e1a0 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r<-9223372036854
1e1b0 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75 72  775808.0 ) retur
1e1c0 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e  n +1;.    if( r>
1e1d0 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1e1e0 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20 2d  807.0 ) return -
1e1f0 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29  1;.    y = (i64)
1e200 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29  r;.    if( i<y )
1e210 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1e220 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20 20  if( i>y ){.     
1e230 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54   if( y==SMALLEST
1e240 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30 20  _INT64 && r>0.0 
1e250 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1e260 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20     return +1;.  
1e270 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f 75    }.    s = (dou
1e280 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73  ble)i;.    if( s
1e290 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1e2a0 20 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65      if( s>r ) re
1e2b0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1e2c0 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
1e2d0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
1e2e0 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64  values contained
1e2f0 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f   by the two memo
1e300 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e  ry cells, return
1e310 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c  ing.** negative,
1e320 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76   zero or positiv
1e330 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65  e if pMem1 is le
1e340 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1e350 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a  o, or greater.**
1e360 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72   than pMem2. Sor
1e370 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55  ting order is NU
1e380 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c  LL's first, foll
1e390 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20  owed by numbers 
1e3a0 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64  (integers.** and
1e3b0 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e   reals) sorted n
1e3c0 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c  umerically, foll
1e3d0 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64  owed by text ord
1e3e0 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c  ered by the coll
1e3f0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1e400 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61  e pColl and fina
1e410 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72  lly blob's order
1e420 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a  ed by memcmp()..
1e430 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76  **.** Two NULL v
1e440 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1e450 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68  ered equal by th
1e460 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
1e470 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  int sqlite3MemCo
1e480 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1e490 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65  *pMem1, const Me
1e4a0 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20  m *pMem2, const 
1e4b0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
1e4c0 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20  .  int f1, f2;. 
1e4d0 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   int combined_fl
1e4e0 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65  ags;..  f1 = pMe
1e4f0 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20  m1->flags;.  f2 
1e500 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a  = pMem2->flags;.
1e510 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73    combined_flags
1e520 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65   = f1|f2;.  asse
1e530 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c  rt( (combined_fl
1e540 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
1e550 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49  )==0 );. .  /* I
1e560 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e  f one value is N
1e570 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20  ULL, it is less 
1e580 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20  than the other. 
1e590 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  If both values. 
1e5a0 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65   ** are NULL, re
1e5b0 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
1e5c0 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1e5d0 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
1e5e0 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d    return (f2&MEM
1e5f0 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d  _Null) - (f1&MEM
1e600 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  _Null);.  }..  /
1e610 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  * At least one o
1e620 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  f the two values
1e630 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a   is a number.  *
1e640 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1e650 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c  _flags&(MEM_Int|
1e660 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20  MEM_Real) ){.   
1e670 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
1e680 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1e690 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1e6a0 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i < pMem2->u.i
1e6b0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1e6c0 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1e6d0 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i > pMem2->u.i 
1e6e0 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1e6f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1e700 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26   }.    if( (f1 &
1e710 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21   f2 & MEM_Real)!
1e720 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1e730 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65  pMem1->u.r < pMe
1e740 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e  m2->u.r ) return
1e750 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1e760 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d  Mem1->u.r > pMem
1e770 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20  2->u.r ) return 
1e780 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1e790 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1e7a0 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f1&MEM_Int)!=
1e7b0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1e7c0 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f2&MEM_Real)!=0 
1e7d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e7e0 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  n sqlite3IntFloa
1e7f0 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e  tCompare(pMem1->
1e800 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29  u.i, pMem2->u.r)
1e810 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e820 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
1e830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e840 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
1e850 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1e860 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e    if( (f2&MEM_In
1e870 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
1e880 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33   return -sqlite3
1e890 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1e8a0 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem2->u.i, pMem
1e8b0 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  1->u.r);.      }
1e8c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1e8d0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
1e8e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1e8f0 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n +1;.  }..  /* 
1e900 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1e910 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65  a string and the
1e920 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62   other is a blob
1e930 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  , the string is 
1e940 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1e950 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20  th are strings, 
1e960 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68  compare using th
1e970 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
1e980 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1e990 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1e9a0 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
1e9b0 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74  if( (f1 & MEM_St
1e9c0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1e9d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1e9e0 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d     if( (f2 & MEM
1e9f0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1ea00 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1ea10 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1ea20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d  pMem1->enc==pMem
1ea30 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d  2->enc || pMem1-
1ea40 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1ea50 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
1ea60 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1ea70 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20  ITE_UTF8 || .   
1ea80 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e           pMem1->
1ea90 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
1eaa0 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e  6LE || pMem1->en
1eab0 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
1eac0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  E );..    /* The
1ead0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1eae0 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69  nce must be defi
1eaf0 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ned at this poin
1eb00 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a  t, even if.    *
1eb10 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74  * the user delet
1eb20 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
1eb30 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20   sequence after 
1eb40 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
1eb50 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69   is.    ** compi
1eb60 6c 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f  led (this was no
1eb70 74 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  t always the cas
1eb80 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  e)..    */.    a
1eb90 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c  ssert( !pColl ||
1eba0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a   pColl->xCmp );.
1ebb0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1ebc0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
1ebd0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1ebe0 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  ing(pMem1, pMem2
1ebf0 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , pColl, 0);.   
1ec00 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e   }.    /* If a N
1ec10 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20  ULL pointer was 
1ec20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
1ec30 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  llate function, 
1ec40 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20  fall through.   
1ec50 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20   ** to the blob 
1ec60 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d  case and use mem
1ec70 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20  cmp().  */.  }. 
1ec80 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65  .  /* Both value
1ec90 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e  s must be blobs.
1eca0 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20    Compare using 
1ecb0 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
1ecc0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c  return sqlite3Bl
1ecd0 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c  obCompare(pMem1,
1ece0 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   pMem2);.}.../*.
1ecf0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
1ed00 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
1ed10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ed20 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74   a serial-type t
1ed30 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  hat.** correspon
1ed40 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ds to an integer
1ed50 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65   - all values be
1ed60 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e  tween 1 and 9 in
1ed70 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65  clusive .** exce
1ed80 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64  pt 7. The second
1ed90 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
1eda0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
1edb0 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a  n integer value.
1edc0 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63  ** serialized ac
1edd0 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61  cording to seria
1ede0 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e  l_type. This fun
1edf0 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
1ee00 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  es.** and return
1ee10 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a  s the value..*/.
1ee20 73 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52  static i64 vdbeR
1ee30 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75  ecordDecodeInt(u
1ee40 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1ee50 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b  const u8 *aKey){
1ee60 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65  .  u32 y;.  asse
1ee70 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
1ee80 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  | (serial_type>=
1ee90 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  1 && serial_type
1eea0 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=9 && serial_ty
1eeb0 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74  pe!=7) );.  swit
1eec0 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
1eed0 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20  ){.    case 0:. 
1eee0 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20     case 1:.     
1eef0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1ef00 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1ef10 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45   return ONE_BYTE
1ef20 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1ef30 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65  case 2:.      te
1ef40 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1ef50 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1ef60 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e  turn TWO_BYTE_IN
1ef70 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1ef80 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 3:.      testc
1ef90 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1efa0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1efb0 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  n THREE_BYTE_INT
1efc0 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1efd0 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   4: {.      test
1efe0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1eff0 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20  80 );.      y = 
1f000 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1f010 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Key);.      retu
1f020 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26  rn (i64)*(int*)&
1f030 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  y;.    }.    cas
1f040 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  e 5: {.      tes
1f050 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1f060 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1f070 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  urn FOUR_BYTE_UI
1f080 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
1f090 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1f0a0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1f0b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1f0c0 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20  : {.      u64 x 
1f0d0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1f0e0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1f0f0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1f100 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20  0x80 );.      x 
1f110 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
1f120 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1f130 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  4);.      return
1f140 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b   (i64)*(i64*)&x;
1f150 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1f160 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
1f170 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e - 8);.}../*.**
1f180 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1f190 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
1f1a0 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
1f1b0 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
1f1c0 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
1f1d0 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
1f1e0 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
1f1f0 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
1f200 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
1f210 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
1f220 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
1f230 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
1f240 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
1f250 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
1f260 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
1f270 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
1f280 65 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  eated by the OP_
1f290 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1f2a0 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
1f2b0 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
1f2c0 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
1f2d0 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
1f2e0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
1f2f0 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
1f300 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  Record..**.** If
1f310 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20   argument bSkip 
1f320 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20  is non-zero, it 
1f330 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1f340 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1f350 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d  lready.** determ
1f360 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1f370 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1f380 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
1f390 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
1f3a0 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
1f3b0 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
1f3c0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
1f3d0 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a  fields. If all .
1f3e0 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ** fields that a
1f3f0 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65  ppear in both ke
1f400 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68  ys are equal, th
1f410 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  en pPKey2->defau
1f420 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74  lt_rc is .** ret
1f430 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1f440 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1f450 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65  ion is discovere
1f460 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65  d, set pPKey2->e
1f470 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51  rrCode to .** SQ
1f480 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64  LITE_CORRUPT and
1f490 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e   return 0. If an
1f4a0 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
1f4b0 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70  countered, .** p
1f4c0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69  PKey2->errCode i
1f4d0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
1f4e0 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74  NOMEM and, if it
1f4f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
1f500 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c  e.** malloc-fail
1f510 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64  ed flag set on d
1f520 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
1f530 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1f540 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ->db)..*/.int sq
1f550 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1f560 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a  ompareWithSkip(.
1f570 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1f580 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1f590 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
1f5a0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1f5b0 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20  d *pPKey2,      
1f5c0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1f5d0 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20  */.  int bSkip  
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
1f600 20 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20   skip the first 
1f610 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33  field */.){.  u3
1f620 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f640 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1f650 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1f660 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
1f670 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f690 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66   Index of next f
1f6a0 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  ield to compare 
1f6b0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1f6e0 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e  record header in
1f6f0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1f700 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20  idx1;           
1f710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1f720 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
1f730 79 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  ype in header */
1f740 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f760 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1f770 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68  ue */.  Mem *pRh
1f780 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  s = pPKey2->aMem
1f790 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  ;       /* Next 
1f7a0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1f7b0 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1f7c0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1f7d0 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1f7e0 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Info;.  const un
1f7f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1f800 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
1f810 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1f820 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  1;.  Mem mem1;..
1f830 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73    /* If bSkip is
1f840 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
1f850 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1f860 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  dy determined th
1f870 61 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  at the first.  *
1f880 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
1f890 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  n the keys are e
1f8a0 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61  qual. Fix the va
1f8b0 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69  rious stack vari
1f8c0 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68  ables so.  ** th
1f8d0 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  at this routine 
1f8e0 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67  begins comparing
1f8f0 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66   at the second f
1f900 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62  ield. */.  if( b
1f910 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20  Skip ){.    u32 
1f920 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31  s1;.    idx1 = 1
1f930 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26   + getVarint32(&
1f940 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20  aKey1[1], s1);. 
1f950 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79     szHdr1 = aKey
1f960 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73  1[0];.    d1 = s
1f970 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56  zHdr1 + sqlite3V
1f980 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1f990 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b  (s1);.    i = 1;
1f9a0 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d  .    pRhs++;.  }
1f9b0 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d  else{.    idx1 =
1f9c0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1f9d0 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20  y1, szHdr1);.   
1f9e0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
1f9f0 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e    if( d1>(unsign
1fa00 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20  ed)nKey1 ){ .   
1fa10 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1fa20 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1fa30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1fa40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1fa50 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1fa60 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b      }.    i = 0;
1fa70 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59  .  }..  VVA_ONLY
1fa80 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
1fa90 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
1faa0 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
1fab0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1fac0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1fad0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  ->pKeyInfo->nAll
1fae0 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1faf0 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c  Field .       ||
1fb00 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1fb10 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1fb20 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1fb30 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1fb40 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1fb50 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1fb60 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1fb70 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1fb80 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1fb90 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1fba0 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f  ial_type;..    /
1fbb0 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65  * RHS is an inte
1fbc0 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ger */.    if( p
1fbd0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1fbe0 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65  _Int ){.      se
1fbf0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1fc00 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74  1[idx1];.      t
1fc10 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1fc20 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1fc30 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1fc40 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1fc50 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1fc60 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1fc70 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1fc80 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1fc90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1fca0 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1fcb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1fcc0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1fcd0 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1fce0 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
1fcf0 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74       rc = -sqlit
1fd00 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1fd10 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d  e(pRhs->u.i, mem
1fd20 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  1.u.r);.      }e
1fd30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
1fd40 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72   lhs = vdbeRecor
1fd50 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61  dDecodeInt(seria
1fd60 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64  l_type, &aKey1[d
1fd70 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34  1]);.        i64
1fd80 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69   rhs = pRhs->u.i
1fd90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68  ;.        if( lh
1fda0 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s<rhs ){.       
1fdb0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1fdc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68      }else if( lh
1fdd0 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s>rhs ){.       
1fde0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1fdf0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fe00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1fe10 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65  is real */.    e
1fe20 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1fe30 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
1fe40 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1fe50 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1fe60 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  ];.      if( ser
1fe70 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
1fe80 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1fe90 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72  l types 12 or gr
1fea0 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67  eater are string
1feb0 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65  s and blobs (gre
1fec0 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  ater than.      
1fed0 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54    ** numbers). T
1fee0 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61  ypes 10 and 11 a
1fef0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65  re currently "re
1ff00 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
1ff10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  e .        ** us
1ff20 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  e", so it doesn'
1ff30 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20  t really matter 
1ff40 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  what the results
1ff50 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20   of comparing.  
1ff60 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f        ** them to
1ff70 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73   numberic values
1ff80 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20   are.  */.      
1ff90 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1ffa0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1ffb0 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1ffc0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1ffd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ffe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1fff0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
20000 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
20010 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
20020 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
20030 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==7 ){.         
20040 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52   if( mem1.u.r<pR
20050 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
20060 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
20070 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
20080 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68  if( mem1.u.r>pRh
20090 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20  s->u.r ){.      
200a0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
200b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
200c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
200d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
200e0 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
200f0 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e  mem1.u.i, pRhs->
20100 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  u.r);.        }.
20110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20120 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
20130 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
20140 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
20150 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
20160 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
20170 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
20180 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
20190 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
201a0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
201b0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
201c0 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
201d0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
201e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
201f0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
20200 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
20210 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
20220 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
20230 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
20240 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
20250 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
20260 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
20270 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
20280 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20290 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
202a0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
202b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
202c0 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
202d0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
202e0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
202f0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20300 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20310 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
20320 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
20330 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
20340 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
20350 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
20360 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
20370 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
20380 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
20390 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  enc;.          m
203a0 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
203b0 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  o->db;.         
203c0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45   mem1.flags = ME
203d0 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20  M_Str;.         
203e0 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a   mem1.z = (char*
203f0 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20  )&aKey1[d1];.   
20400 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
20410 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
20420 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
20430 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65  &mem1, pRhs, pKe
20440 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c  yInfo->aColl[i],
20450 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64   &pPKey2->errCod
20460 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
20470 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20480 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
20490 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70   = MIN(mem1.n, p
204a0 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
204b0 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
204c0 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
204d0 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
204e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
204f0 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70   rc = mem1.n - p
20500 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20  Rhs->n; .       
20510 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20520 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
20530 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c  a blob */.    el
20540 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
20550 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b  gs & MEM_Blob ){
20560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
20570 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
20580 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52  M_Zero)==0 || pR
20590 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  hs->n==0 );.    
205a0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
205b0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
205c0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
205d0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
205e0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
205f0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
20600 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c  pe<12 || (serial
20610 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
20620 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
20630 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20640 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20         int nStr 
20650 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
20660 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
20670 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
20680 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64  nStr)==(unsigned
20690 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
206a0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
206b0 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  nStr+1)==(unsign
206c0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
206d0 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72      if( (d1+nStr
206e0 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
206f0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
20700 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
20710 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
20720 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20730 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20750 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
20760 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
20770 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
20780 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
20790 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c        if( !isAll
207a0 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 72  Zero((const char
207b0 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74  *)&aKey1[d1],nSt
207c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
207d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
207e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
207f0 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74 72         rc = nStr
20800 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f   - pRhs->u.nZero
20810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20830 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
20840 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73  = MIN(nStr, pRhs
20850 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
20860 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
20870 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
20880 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
20890 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
208a0 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
208b0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
208c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
208d0 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a  /* RHS is null *
208e0 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  /.    else{.    
208f0 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
20900 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
20910 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f     rc = (serial_
20920 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  type!=0);.    }.
20930 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
20940 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  {.      if( pKey
20950 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
20960 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
20970 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
20980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
20990 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
209a0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
209b0 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20  y1, pPKey2, rc) 
209c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
209d0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
209e0 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
209f0 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
20a00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20a10 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20     }..    i++;. 
20a20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64     pRhs++;.    d
20a30 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
20a40 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
20a50 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
20a60 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56  idx1 += sqlite3V
20a70 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f  arintLen(serial_
20a80 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
20a90 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29   idx1<(unsigned)
20aa0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
20ab0 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31  y2->nField && d1
20ac0 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  <=(unsigned)nKey
20ad0 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  1 );..  /* No me
20ae0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
20af0 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
20b00 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
20b10 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
20b20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
20b30 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
20b40 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
20b50 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
20b60 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
20b70 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
20b80 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
20b90 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a  lease(&mem1).  *
20ba0 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
20bb0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
20bc0 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
20bd0 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
20be0 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
20bf0 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
20c00 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
20c10 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
20c20 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
20c30 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
20c40 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
20c50 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
20c60 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
20c70 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
20c80 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20c90 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
20ca0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50  Key1, pPKey2, pP
20cb0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
20cc0 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65  ) .       || pKe
20cd0 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
20ce0 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70  cFailed.  );.  p
20cf0 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
20d00 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  1;.  return pPKe
20d10 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
20d20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
20d30 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
20d40 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
20d50 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
20d60 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
20d70 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
20d80 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
20d90 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
20da0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
20db0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20dc0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
20dd0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20de0 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
20df0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20e00 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
20e10 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
20e20 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20e30 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
20e40 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
20e50 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
20e60 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
20e70 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
20e80 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
20e90 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
20ea0 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
20eb0 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
20ec0 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
20ed0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
20ee0 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
20ef0 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
20f00 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
20f10 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
20f20 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
20f30 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
20f40 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
20f50 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
20f60 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
20f70 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
20f80 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
20f90 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
20fa0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
20fb0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
20fc0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
20fd0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
20fe0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
20ff0 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
21000 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
21010 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
21020 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
21030 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
21040 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
21050 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
21060 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
21070 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
21080 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  4 x;.  i64 v;.  
21090 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65  i64 lhs;..  vdbe
210a0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
210b0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
210c0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
210d0 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
210e0 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70  assert( (*(u8*)p
210f0 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43  Key1)<=0x3F || C
21100 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73  ORRUPT_DB );.  s
21110 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
21120 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
21130 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
21140 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
21150 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f        lhs = ONE_
21160 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
21170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21180 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
21190 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
211a0 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
211b0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
211c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
211d0 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  = TWO_BYTE_INT(a
211e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
211f0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
21200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21210 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
21220 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
21230 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
21240 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59    lhs = THREE_BY
21250 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
21260 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
21270 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
21280 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21290 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
212a0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
212b0 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
212c0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
212d0 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  y);.      lhs = 
212e0 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
212f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21300 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
21310 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
21320 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
21330 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
21340 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
21350 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
21360 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
21370 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
21380 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
21390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
213a0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
213b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
213c0 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74  se 6: { /* 8-byt
213d0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
213e0 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f   */.      x = FO
213f0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
21400 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  y);.      x = (x
21410 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
21420 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
21430 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36        lhs = *(i6
21440 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73  4*)&x;.      tes
21450 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
21460 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21470 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a   }.    case 8: .
21480 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20        lhs = 0;. 
21490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
214a0 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68  case 9:.      lh
214b0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  s = 1;.      bre
214c0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ak;..    /* This
214d0 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72   case could be r
214e0 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63  emoved without c
214f0 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75  hanging the resu
21500 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20  lts of running. 
21510 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e     ** this code.
21520 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61   Including it ca
21530 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65  uses gcc to gene
21540 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77  rate a faster sw
21550 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61  itch .    ** sta
21560 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68  tement (since th
21570 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63  e range of switc
21580 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74  h targets now st
21590 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64  arts at zero and
215a0 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69  .    ** is conti
215b0 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20  guous) but does 
215c0 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75  not cause any du
215d0 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20  plicate code to 
215e0 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  be generated.   
215f0 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63   ** (as gcc is c
21600 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20  lever enough to 
21610 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20  combine the two 
21620 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68  like cases). Oth
21630 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  er .    ** compi
21640 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69  lers might be si
21650 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20  milar.  */ .    
21660 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a  case 0: case 7:.
21670 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
21680 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21690 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
216a0 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20  y1, pPKey2);..  
216b0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
216c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
216d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
216e0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
216f0 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76  PKey2);.  }..  v
21700 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
21710 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e  0].u.i;.  if( v>
21720 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
21730 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d   pPKey2->r1;.  }
21740 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29  else if( v<lhs )
21750 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
21760 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20  y2->r2;.  }else 
21770 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
21780 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ld>1 ){.    /* T
21790 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
217a0 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
217b0 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61  are equal. Compa
217c0 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  re the trailing 
217d0 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
217e0 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71   */.    res = sq
217f0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21800 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
21810 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
21820 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  ey2, 1);.  }else
21830 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
21840 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
21850 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
21860 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72  ual and there ar
21870 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20  e no trailing.  
21880 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74    ** fields. Ret
21890 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
218a0 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63  ult_rc in this c
218b0 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20  ase. */.    res 
218c0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
218d0 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32  t_rc;.    pPKey2
218e0 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
218f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
21900 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
21910 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
21920 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29  , pPKey2, res) )
21930 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
21940 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
21950 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
21960 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
21970 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
21980 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
21990 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
219a0 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
219b0 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c  ey2 is a string,
219c0 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69   that (b) the fi
219d0 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65  rst field.** use
219e0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
219f0 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20  sequence BINARY 
21a00 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65  and (c) that the
21a10 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
21a20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68  varint .** at th
21a30 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
21a40 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
21a50 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
21a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
21a70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
21a80 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65  tring(.  int nKe
21a90 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
21aa0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
21ab0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
21ac0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
21ad0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
21ae0 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
21af0 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f   u8 *aKey1 = (co
21b00 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20  nst u8*)pKey1;. 
21b10 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
21b20 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
21b30 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
21b40 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20  aMem[0].flags & 
21b50 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62  MEM_Str );.  vdb
21b60 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
21b70 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
21b80 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
21b90 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
21ba0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
21bb0 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74  ey1[1], serial_t
21bc0 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69  ype);.  if( seri
21bd0 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
21be0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21bf0 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r1;      /* (pKe
21c00 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e  y1/nKey1) is a n
21c10 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20  umber or a null 
21c20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  */.  }else if( !
21c30 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
21c40 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73  x01) ){ .    res
21c50 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20   = pPKey2->r2;  
21c60 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
21c70 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a  ey1) is a blob *
21c80 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
21c90 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74  nt nCmp;.    int
21ca0 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73   nStr;.    int s
21cb0 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  zHdr = aKey1[0];
21cc0 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65  ..    nStr = (se
21cd0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20  rial_type-12) / 
21ce0 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64  2;.    if( (szHd
21cf0 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79  r + nStr) > nKey
21d00 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79  1 ){.      pPKey
21d10 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
21d20 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
21d30 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
21d40 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72  rn 0;    /* Corr
21d50 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
21d60 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20      nCmp = MIN( 
21d70 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
21d80 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72  n, nStr );.    r
21d90 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  es = memcmp(&aKe
21da0 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79  y1[szHdr], pPKey
21db0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43  2->aMem[0].z, nC
21dc0 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65  mp);..    if( re
21dd0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  s==0 ){.      re
21de0 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79  s = nStr - pPKey
21df0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20  2->aMem[0].n;.  
21e00 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
21e10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
21e20 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29  Key2->nField>1 )
21e30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
21e40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
21e50 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
21e60 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
21e70 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
21e80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21e90 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
21ea0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
21eb0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
21ec0 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
21ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21ee0 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
21ef0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
21f00 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20  PKey2->r2;.     
21f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21f20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
21f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
21f40 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
21f50 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
21f60 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c  ey2->r2;.    }el
21f70 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
21f80 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
21f90 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
21fa0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
21fb0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
21fc0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
21fd0 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  s).       || COR
21fe0 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c  RUPT_DB.       |
21ff0 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  | pPKey2->pKeyIn
22000 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
22010 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
22020 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
22030 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22040 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56  r to an sqlite3V
22050 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22060 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75  () compatible fu
22070 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62  nction.** suitab
22080 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  le for comparing
22090 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f   serialized reco
220a0 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63  rds to the unpac
220b0 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65  ked record passe
220c0 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
220d0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65   argument..*/.Re
220e0 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69  cordCompare sqli
220f0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
22100 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  re(UnpackedRecor
22110 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69  d *p){.  /* vari
22120 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
22130 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52  nt() and varintR
22140 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
22150 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65  ng() both assume
22160 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
22170 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
22180 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
22190 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
221a0 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a   each record.  *
221b0 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  * fits in a sing
221c0 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  le byte (i.e. is
221d0 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76   127 or less). v
221e0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
221f0 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73  reInt().  ** als
22200 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  o assumes that i
22210 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
22220 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62  rread a buffer b
22230 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a  y at least the .
22240 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73    ** maximum pos
22250 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64  sible legal head
22260 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62  er size plus 8 b
22270 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68  ytes. Because th
22280 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72  ere is.  ** guar
22290 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20  anteed to be at 
222a0 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f  least 74 (but no
222b0 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20  t 136) bytes of 
222c0 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  padding followin
222d0 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66  g each.  ** buff
222e0 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72  er passed to var
222f0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
22300 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73  Int() this makes
22310 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   it convenient t
22320 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65  o.  ** limit the
22330 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
22340 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20  der to 64 bytes 
22350 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74  in cases where t
22360 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20  he first field. 
22370 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65   ** is an intege
22380 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
22390 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
223a0 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d  enforce this lim
223b0 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65  it is to conside
223c0 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77  r only records w
223d0 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c  ith.  ** 13 fiel
223e0 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74  ds or less. If t
223f0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69  he first field i
22400 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68  s an integer, th
22410 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a  e maximum legal.
22420 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65    ** header size
22430 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20   is (12*5 + 1 + 
22440 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20  1) bytes.  */.  
22450 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
22460 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29  >nAllField<=13 )
22470 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
22480 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  = p->aMem[0].fla
22490 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  gs;.    if( p->p
224a0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
224b0 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  der[0] ){.      
224c0 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->r1 = 1;.     
224d0 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20   p->r2 = -1;.   
224e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
224f0 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  >r1 = -1;.      
22500 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d  p->r2 = 1;.    }
22510 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
22520 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20  & MEM_Int) ){.  
22530 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
22540 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b  ecordCompareInt;
22550 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
22560 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
22570 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Real );.    tes
22580 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
22590 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74  EM_Null );.    t
225a0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
225b0 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
225c0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d   if( (flags & (M
225d0 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c  EM_Real|MEM_Null
225e0 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26  |MEM_Blob))==0 &
225f0 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
22600 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  Coll[0]==0 ){.  
22610 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
22620 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
22630 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
22640 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
22650 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
22660 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
22670 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22680 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
22690 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
226a0 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
226b0 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
226c0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
226d0 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
226e0 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
226f0 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
22700 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
22710 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
22720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
22730 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
22740 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
22750 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
22760 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
22770 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
22780 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
22790 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
227a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
227b0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
227c0 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
227d0 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
227e0 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
227f0 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
22800 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
22810 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
22820 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
22830 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
22840 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
22850 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
22860 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
22870 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
22880 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
22890 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
228a0 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
228b0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
228c0 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
228d0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
228e0 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
228f0 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
22900 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
22910 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
22920 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
22930 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
22940 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
22950 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
22960 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
22970 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
22980 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
22990 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
229a0 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
229b0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
229c0 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
229d0 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
229e0 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
229f0 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
22a00 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
22a10 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
22a20 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
22a30 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
22a40 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
22a50 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
22a60 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ur);.  assert( (
22a70 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
22a80 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
22a90 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
22aa0 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
22ab0 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
22ac0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
22ad0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
22ae0 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
22af0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
22b00 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
22b10 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
22b20 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
22b30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
22b40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22b50 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
22b60 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
22b70 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
22b80 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
22b90 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
22ba0 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
22bb0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
22bc0 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
22bd0 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
22be0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
22bf0 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
22c00 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
22c10 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
22c20 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
22c30 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
22c40 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
22c50 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
22c60 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
22c70 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
22c80 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
22c90 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
22ca0 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
22cb0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
22cc0 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
22cd0 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
22ce0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22cf0 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
22d00 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22d10 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
22d20 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22d30 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
22d40 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
22d50 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22d60 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
22d70 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22d80 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
22d90 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22da0 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
22db0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
22dc0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
22dd0 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
22de0 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
22df0 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
22e00 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
22e10 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
22e20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
22e30 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
22e40 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d  Sizes[typeRowid]
22e50 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
22e60 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
22e70 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
22e80 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
22e90 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
22ea0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
22eb0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
22ec0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
22ed0 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
22ee0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
22ef0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
22f00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
22f10 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
22f20 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
22f30 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
22f40 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
22f50 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
22f60 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22f70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22f80 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
22f90 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
22fa0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
22fb0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
22fc0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
22fd0 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
22fe0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
22ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23000 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
23010 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
23020 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
23030 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
23040 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
23050 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
23060 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23070 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
23080 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
23090 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
230a0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
230b0 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
230c0 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
230d0 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
230e0 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
230f0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
23100 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
23110 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
23120 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
23130 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
23140 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
23150 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
23160 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
23170 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
23180 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
23190 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
231a0 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
231b0 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
231c0 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
231d0 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
231e0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
231f0 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
23200 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23210 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
23220 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
23230 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
23240 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
23250 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
23260 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
23270 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
23280 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
23290 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
232a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
232b0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
232c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
232f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
23300 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23320 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
23330 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
23340 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
23350 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
23360 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
23370 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
23380 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
23390 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
233a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
233b0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
233c0 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
233d0 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
233e0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
233f0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
23400 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  ur;.  Mem m;..  
23410 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
23420 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
23430 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20  REE );.  pCur = 
23440 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
23450 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23460 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
23470 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
23480 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
23490 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
234a0 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43  e(pCur);.  /* nC
234b0 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
234c0 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
234d0 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
234e0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
234f0 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
23500 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
23510 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
23520 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
23530 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
23540 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
23550 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
23560 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
23570 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
23580 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23590 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
235a0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
235b0 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
235c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
235d0 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
235e0 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
235f0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
23600 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
23610 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73  ;.  }.  *res = s
23620 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
23630 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a  Compare(m.n, m.z
23640 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  , pUnpacked);.  
23650 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
23660 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
23670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23680 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
23690 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
236a0 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
236b0 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
236c0 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
236d0 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
236e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
236f0 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
23700 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
23710 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
23720 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
23730 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
23740 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
23750 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
23760 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
23770 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
23780 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
23790 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
237a0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
237b0 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
237c0 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
237d0 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
237e0 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
237f0 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
23800 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
23810 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
23820 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
23830 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
23840 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
23850 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
23860 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
23870 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
23880 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
23890 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
238a0 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
238b0 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
238c0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
238d0 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
238e0 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
238f0 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
23900 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
23910 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
23920 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
23930 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
23940 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
23950 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
23960 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
23970 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
23980 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
23990 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
239a0 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
239b0 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
239c0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
239d0 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
239e0 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
239f0 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
23a00 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
23a10 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
23a20 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
23a30 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
23a40 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
23a50 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
23a60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
23a70 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
23a80 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
23a90 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
23aa0 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
23ab0 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
23ac0 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
23ad0 75 72 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 50  urn the SQLITE_P
23ae0 52 45 50 41 52 45 20 66 6c 61 67 73 20 66 6f 72  REPARE flags for
23af0 20 61 20 56 64 62 65 2e 0a 2a 2f 0a 75 38 20 73   a Vdbe..*/.u8 s
23b00 71 6c 69 74 65 33 56 64 62 65 50 72 65 70 61 72  qlite3VdbePrepar
23b10 65 46 6c 61 67 73 28 56 64 62 65 20 2a 76 29 7b  eFlags(Vdbe *v){
23b20 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 70 72 65  .  return v->pre
23b30 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pFlags;.}../*.**
23b40 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
23b50 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
23b60 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20  value structure 
23b70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
23b80 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61  alue bound.** pa
23b90 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20  rameter iVar of 
23ba0 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66  VM v. Except, if
23bb0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
23bc0 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72   SQL NULL, retur
23bd0 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e  n .** 0 instead.
23be0 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
23bf0 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69  LL, apply affini
23c00 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74  ty aff (one of t
23c10 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a  he SQLITE_AFF_*.
23c20 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f  ** constants) to
23c30 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
23c40 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a  e returning it..
23c50 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
23c60 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65  ed value must be
23c70 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
23c80 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
23c90 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
23ca0 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
23cb0 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42  *sqlite3VdbeGetB
23cc0 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a  oundValue(Vdbe *
23cd0 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
23ce0 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
23cf0 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
23d00 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
23d10 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
23d20 61 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  ar-1];.    asser
23d30 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73  t( (v->db->flags
23d40 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   & SQLITE_Enable
23d50 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20 20 20 20  QPSG)==0 );.    
23d60 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
23d70 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
23d80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23d90 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
23da0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
23db0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
23dc0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
23dd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
23de0 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
23df0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
23e00 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
23e10 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
23e20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
23e30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23e40 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20   return pRet;.  
23e50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23e60 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
23e70 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61  figure SQL varia
23e80 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74  ble iVar so that
23e90 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76   binding a new v
23ea0 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61  alue to it signa
23eb0 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ls.** to sqlite3
23ec0 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68  _reoptimize() th
23ed0 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20  at re-preparing 
23ee0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  the statement ma
23ef0 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
23f00 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c   better query pl
23f10 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  an..*/.void sqli
23f20 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
23f30 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  k(Vdbe *v, int i
23f40 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Var){.  assert( 
23f50 69 56 61 72 3e 30 20 29 3b 0a 20 20 61 73 73 65  iVar>0 );.  asse
23f60 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67  rt( (v->db->flag
23f70 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s & SQLITE_Enabl
23f80 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20 20 69  eQPSG)==0 );.  i
23f90 66 28 20 69 56 61 72 3e 3d 33 32 20 29 7b 0a 20  f( iVar>=32 ){. 
23fa0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
23fb0 20 30 78 38 30 30 30 30 30 30 30 3b 0a 20 20 7d   0x80000000;.  }
23fc0 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
23fd0 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
23fe0 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
23ff0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  }.}../*.** Cause
24000 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74   a function to t
24010 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
24020 20 69 74 20 77 61 73 20 63 61 6c 6c 20 66 72 6f   it was call fro
24030 6d 20 4f 50 5f 50 75 72 65 46 75 6e 63 0a 2a 2a  m OP_PureFunc.**
24040 20 72 61 74 68 65 72 20 74 68 61 6e 20 4f 50 5f   rather than OP_
24050 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  Function..**.** 
24060 4f 50 5f 50 75 72 65 46 75 6e 63 20 6d 65 61 6e  OP_PureFunc mean
24070 73 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  s that the funct
24080 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 65 74 65  ion must be dete
24090 72 6d 69 6e 69 73 74 69 63 2c 20 61 6e 64 20 73  rministic, and s
240a0 68 6f 75 6c 64 0a 2a 2a 20 74 68 72 6f 77 20 61  hould.** throw a
240b0 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 69 73  n error if it is
240c0 20 67 69 76 65 6e 20 69 6e 70 75 74 73 20 74 68   given inputs th
240d0 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69 74  at would make it
240e0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
240f0 69 63 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ic..** This rout
24100 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ine is invoked b
24110 79 20 64 61 74 65 2f 74 69 6d 65 20 66 75 6e 63  y date/time func
24120 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 6e  tions that use n
24130 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
24140 0a 2a 2a 20 66 65 61 74 75 72 65 73 20 73 75 63  .** features suc
24150 68 20 61 73 20 27 6e 6f 77 27 2e 0a 2a 2f 0a 69  h as 'now'..*/.i
24160 6e 74 20 73 71 6c 69 74 65 33 4e 6f 74 50 75 72  nt sqlite3NotPur
24170 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
24180 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 23 69  ntext *pCtx){.#i
24190 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
241a0 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
241b0 34 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56  4.  if( pCtx->pV
241c0 64 62 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  dbe==0 ) return 
241d0 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
241e0 70 43 74 78 2d 3e 70 56 64 62 65 2d 3e 61 4f 70  pCtx->pVdbe->aOp
241f0 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e 6f 70 63 6f  [pCtx->iOp].opco
24200 64 65 3d 3d 4f 50 5f 50 75 72 65 46 75 6e 63 20  de==OP_PureFunc 
24210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
24220 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
24230 2c 20 0a 20 20 20 20 20 20 20 22 6e 6f 6e 2d 64  , .       "non-d
24240 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e  eterministic fun
24250 63 74 69 6f 6e 20 69 6e 20 69 6e 64 65 78 20 65  ction in index e
24260 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 43 48 45  xpression or CHE
24270 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 22 2c 0a  CK constraint",.
24280 20 20 20 20 20 20 20 2d 31 29 3b 0a 20 20 20 20         -1);.    
24290 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
242a0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23 69 66  return 1;.}..#if
242b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
242c0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
242d0 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72  .** Transfer err
242e0 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
242f0 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f  from an sqlite3_
24300 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65  vtab.zErrMsg (te
24310 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
24320 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
24330 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
24340 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65  loc) into a Vdbe
24350 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
24360 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
24370 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
24380 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
24390 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
243a0 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
243b0 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69  sg(Vdbe *p, sqli
243c0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
243d0 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a  {.  if( pVtab->z
243e0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71  ErrMsg ){.    sq
243f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
24400 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  b;.    sqlite3Db
24410 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
24420 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
24430 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
24440 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62  StrDup(db, pVtab
24450 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
24460 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
24470 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
24480 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
24490 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
244a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
244b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
244c0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
244d0 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
244e0 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66  E_HOOK../*.** If
244f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
24500 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
24510 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c  , release any al
24520 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
24530 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68  ated .** with th
24540 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69  e memory cells i
24550 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20  n the p->aMem[] 
24560 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65  array. Also free
24570 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63   the UnpackedRec
24580 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
24590 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73   itself, using s
245a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
245b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
245c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66  ion is used to f
245d0 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ree UnpackedReco
245e0 72 64 20 73 74 72 75 63 74 75 72 65 73 20 61 6c  rd structures al
245f0 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
24600 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f  e vdbeUnpackReco
24610 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  rd() function fo
24620 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63  und in vdbeapi.c
24630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24640 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
24650 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
24660 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63  nt nField, Unpac
24670 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
24680 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
24690 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
246a0 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  ; i<nField; i++)
246b0 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
246c0 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b  m = &p->aMem[i];
246d0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
246e0 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  >zMalloc ) sqlit
246f0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
24700 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
24710 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
24720 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  N(db, p);.  }.}.
24730 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
24740 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
24750 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65  E_HOOK */..#ifde
24760 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
24770 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f  PREUPDATE_HOOK./
24780 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
24790 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e  pre-update hook.
247a0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 55   If this is an U
247b0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
247c0 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c  pre-update call,
247d0 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20  .** then cursor 
247e0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
247f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68  cond argument sh
24800 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68  ould point to th
24810 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74  e row about.** t
24820 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64  o be update or d
24830 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20 61  eleted. If the a
24840 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73  pplication calls
24850 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
24860 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65  te_old(),.** the
24870 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20   required value 
24880 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
24890 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  m the row the cu
248a0 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  rsor points to..
248b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
248c0 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  dbePreUpdateHook
248d0 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d      /* Vdbe pre-
24900 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69  update hook is i
24910 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56  nvoked by */.  V
24920 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  dbeCursor *pCsr,
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24940 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62  * Cursor to grab
24950 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72   old.* values fr
24960 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  om */.  int op, 
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24980 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
24990 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  E_INSERT, UPDATE
249a0 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   or DELETE */.  
249b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65  /* Database name
249e0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
249f0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
24a00 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65        /* Modifie
24a10 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34  d table */.  i64
24a20 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20   iKey1,         
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a40 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75  Initial key valu
24a50 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
24a80 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63  er for new.* rec
24a90 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ord */.){.  sqli
24aa0 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b  te3 *db = v->db;
24ab0 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20  .  i64 iKey2;.  
24ac0 50 72 65 55 70 64 61 74 65 20 70 72 65 75 70 64  PreUpdate preupd
24ad0 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ate;.  const cha
24ae0 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e  r *zTbl = pTab->
24af0 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20  zName;.  static 
24b00 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72  const u8 fakeSor
24b10 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61  tOrder = 0;..  a
24b20 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55  ssert( db->pPreU
24b30 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65  pdate==0 );.  me
24b40 6d 73 65 74 28 26 70 72 65 75 70 64 61 74 65 2c  mset(&preupdate,
24b50 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70   0, sizeof(PreUp
24b60 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20 48 61  date));.  if( Ha
24b70 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20  sRowid(pTab)==0 
24b80 29 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d 20 69  ){.    iKey1 = i
24b90 4b 65 79 32 20 3d 20 30 3b 0a 20 20 20 20 70 72  Key2 = 0;.    pr
24ba0 65 75 70 64 61 74 65 2e 70 50 6b 20 3d 20 73 71  eupdate.pPk = sq
24bb0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
24bc0 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65  ndex(pTab);.  }e
24bd0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d  lse{.    if( op=
24be0 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29  =SQLITE_UPDATE )
24bf0 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
24c00 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e  v->aMem[iReg].u.
24c10 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
24c20 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79      iKey2 = iKey
24c30 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
24c40 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46  assert( pCsr->nF
24c50 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
24c60 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73   .       || (pCs
24c70 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d  r->nField==pTab-
24c80 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53  >nCol+1 && op==S
24c90 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20  QLITE_DELETE && 
24ca0 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a  iReg==-1).  );..
24cb0 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20    preupdate.v = 
24cc0 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  v;.  preupdate.p
24cd0 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72  Csr = pCsr;.  pr
24ce0 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b  eupdate.op = op;
24cf0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65  .  preupdate.iNe
24d00 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70  wReg = iReg;.  p
24d10 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
24d20 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75  .db = db;.  preu
24d30 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e  pdate.keyinfo.en
24d40 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70  c = ENC(db);.  p
24d50 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
24d60 2e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 70 54 61  .nKeyField = pTa
24d70 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70  b->nCol;.  preup
24d80 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f  date.keyinfo.aSo
24d90 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
24da0 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20  fakeSortOrder;. 
24db0 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31   preupdate.iKey1
24dc0 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75   = iKey1;.  preu
24dd0 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b  pdate.iKey2 = iK
24de0 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey2;.  preupdate
24df0 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20  .pTab = pTab;.. 
24e00 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20   db->pPreUpdate 
24e10 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20  = &preupdate;.  
24e20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
24e30 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55  llback(db->pPreU
24e40 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70  pdateArg, db, op
24e50 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65  , zDb, zTbl, iKe
24e60 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62  y1, iKey2);.  db
24e70 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 30  ->pPreUpdate = 0
24e80 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
24e90 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  e(db, preupdate.
24ea0 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64 62 65  aRecord);.  vdbe
24eb0 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
24ec0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
24ed0 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20  fo.nKeyField+1, 
24ee0 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63  preupdate.pUnpac
24ef0 6b 65 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ked);.  vdbeFree
24f00 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
24f10 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
24f20 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75  KeyField+1, preu
24f30 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b  pdate.pNewUnpack
24f40 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70  ed);.  if( preup
24f50 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20  date.aNew ){.   
24f60 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
24f70 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69  i=0; i<pCsr->nFi
24f80 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
24f90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
24fa0 65 6c 65 61 73 65 28 26 70 72 65 75 70 64 61 74  elease(&preupdat
24fb0 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  e.aNew[i]);.    
24fc0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
24fd0 72 65 65 4e 4e 28 64 62 2c 20 70 72 65 75 70 64  reeNN(db, preupd
24fe0 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d  ate.aNew);.  }.}
24ff0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
25000 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
25010 54 45 5f 48 4f 4f 4b 20 2a 2f 0a                 TE_HOOK */.