/ Hex Artifact Content
Login

Artifact 0fdf97855e523489b8a75483e872164418b46651d8bfd74c6f526b4cbaf3c41d:


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 0a  .p5 = p5;.}../*.
6690: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
66a0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
66b0: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
66c0: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
66d0: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
66e0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
66f0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
6700: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
6710: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6720: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
6730: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
6740: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
6750: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
6760: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
6770: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
6780: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
6790: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
67a0: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
67b0: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
67c0: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
67d0: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
67e0: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
67f0: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c  eralFunction(sql
6800: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
6810: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
6820: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
6830: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
6840: 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20  PHEM)!=0 ){.    
6850: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
6860: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
6870: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
6880: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
6890: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
68a0: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
68b0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
68c0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
68d0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
68e0: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
68f0: 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a 64 62  4Mem(sqlite3 *db
6900: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28  , Mem *p){.  if(
6910: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
6920: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6930: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
6940: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
6950: 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63  db, p);.}.static
6960: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
6970: 20 76 6f 69 64 20 66 72 65 65 50 34 46 75 6e 63   void freeP4Func
6980: 43 74 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Ctx(sqlite3 *db,
6990: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
69a0: 20 2a 70 29 7b 0a 20 20 66 72 65 65 45 70 68 65   *p){.  freeEphe
69b0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
69c0: 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 73 71  , p->pFunc);. sq
69d0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
69e0: 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  , p);.}.static v
69f0: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
6a00: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
6a10: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
6a20: 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20   assert( db );. 
6a30: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
6a40: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46  ){.    case P4_F
6a50: 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20  UNCCTX: {.      
6a60: 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 64 62  freeP4FuncCtx(db
6a70: 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  , (sqlite3_conte
6a80: 78 74 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  xt*)p4);.      b
6a90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6aa0: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20  case P4_REAL:.  
6ab0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
6ac0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e  .    case P4_DYN
6ad0: 41 4d 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  AMIC:.    case P
6ae0: 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63  4_DYNBLOB:.    c
6af0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
6b00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6b10: 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a  DbFree(db, p4);.
6b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6b30: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b   }.    case P4_K
6b40: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
6b50: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
6b60: 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  reed==0 ) sqlite
6b70: 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b  3KeyInfoUnref((K
6b80: 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20  eyInfo*)p4);.   
6b90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6ba0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6bb0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
6bc0: 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58  S.    case P4_EX
6bd0: 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  PR: {.      sqli
6be0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6bf0: 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20  , (Expr*)p4);.  
6c00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6c10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
6c20: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
6c30: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
6c40: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
6c50: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
6c60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6c70: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
6c80: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
6c90: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
6ca0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
6cb0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
6cc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
6cd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6ce0: 20 20 20 20 20 20 20 20 66 72 65 65 50 34 4d 65          freeP4Me
6cf0: 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29 3b  m(db, (Mem*)p4);
6d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6d10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6d20: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b  case P4_VTAB : {
6d30: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70  .      if( db->p
6d40: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
6d50: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
6d60: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29  ck((VTable *)p4)
6d70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6d80: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6d90: 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65  * Free the space
6da0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
6db0: 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61  Op and any p4 va
6dc0: 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  lues allocated f
6dd0: 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  or the.** opcode
6de0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
6df0: 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f  in. If aOp is no
6e00: 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73  t NULL it is ass
6e10: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
6e20: 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e  .** nOp entries.
6e30: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
6e40: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
6e50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70  (sqlite3 *db, Op
6e60: 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b   *aOp, int nOp){
6e70: 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20  .  if( aOp ){.  
6e80: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66    Op *pOp;.    f
6e90: 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70 2d  or(pOp=&aOp[nOp-
6ea0: 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20 70 4f  1]; pOp>=aOp; pO
6eb0: 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p--){.      if( 
6ec0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c 3d 20 50  pOp->p4type <= P
6ed0: 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20 29 20 66  4_FREE_IF_LE ) f
6ee0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
6ef0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
6f00: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6f10: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
6f20: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73  COMMENTS.      s
6f30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6f40: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
6f50: 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20  .#endif     .   
6f60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
6f70: 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f 70 29 3b  FreeNN(db, aOp);
6f80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  .  }.}../*.** Li
6f90: 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72 61  nk the SubProgra
6fa0: 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  m object passed 
6fb0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6fc0: 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20  gument into the 
6fd0: 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61  linked.** list a
6fe0: 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72  t Vdbe.pSubProgr
6ff0: 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73  am. This list is
7000: 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20   used to delete 
7010: 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a  all sub-program.
7020: 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20  ** objects when 
7030: 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e  the VM is no lon
7040: 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
7050: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7060: 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28  eLinkSubProgram(
7070: 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62  Vdbe *pVdbe, Sub
7080: 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70  Program *p){.  p
7090: 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d  ->pNext = pVdbe-
70a0: 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64  >pProgram;.  pVd
70b0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70  be->pProgram = p
70c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
70d0: 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20  e the opcode at 
70e0: 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f  addr into OP_Noo
70f0: 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  p.*/.int sqlite3
7100: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
7110: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
7120: 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70  dr){.  VdbeOp *p
7130: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  Op;.  if( p->db-
7140: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
7150: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
7160: 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61  rt( addr>=0 && a
7170: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
7180: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
7190: 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 70 2d  dr];.  freeP4(p-
71a0: 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  >db, pOp->p4type
71b0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
71c0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
71d0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d  _NOTUSED;.  pOp-
71e0: 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.z = 0;.  pOp
71f0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
7200: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  op;.  return 1;.
7210: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
7220: 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22  last opcode is "
7230: 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  op" and it is no
7240: 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  t a jump destina
7250: 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  tion,.** then re
7260: 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e  move it.  Return
7270: 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c   true if and onl
7280: 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77  y if an opcode w
7290: 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  as removed..*/.i
72a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nt sqlite3VdbeDe
72b0: 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28  letePriorOpcode(
72c0: 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b  Vdbe *p, u8 op){
72d0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20  .  if( p->nOp>0 
72e0: 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  && p->aOp[p->nOp
72f0: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29  -1].opcode==op )
7300: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
7310: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
7320: 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31  Noop(p, p->nOp-1
7330: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
7350: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
7360: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
7370: 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  4 operand for a 
7380: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
7390: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
73a0: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
73b0: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
73c0: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
73d0: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
73e0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
73f0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
7400: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
7410: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
7420: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
7430: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  he program..**.*
7440: 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74  * If n>=0 then t
7450: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73  he P4 operand is
7460: 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e   dynamic, meanin
7470: 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66  g that a copy of
7480: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
7490: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
74a0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
74b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
74c0: 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  )..** A value of
74d0: 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79   n==0 means copy
74e0: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70   bytes of zP4 up
74f0: 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e   to and includin
7500: 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  g the.** first n
7510: 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e  ull byte.  If n>
7520: 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20  0 then copy n+1 
7530: 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a  bytes of zP4..**
7540: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
7550: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
7560: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
7570: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
7580: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
7590: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
75a0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
75b0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
75c0: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
75d0: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
75e0: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
75f0: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
7600: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
7610: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
7620: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
7630: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
7640: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
7650: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
7660: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
7670: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65  TE_NOINLINE vdbe
7680: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20  ChangeP4Full(.  
7690: 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70  Vdbe *p,.  Op *p
76a0: 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Op,.  const char
76b0: 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29   *zP4,.  int n.)
76c0: 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74  {.  if( pOp->p4t
76d0: 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50  ype ){.    freeP
76e0: 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34  4(p->db, pOp->p4
76f0: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
7700: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
7710: 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  e = 0;.    pOp->
7720: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  p4.p = 0;.  }.  
7730: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73  if( n<0 ){.    s
7740: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7750: 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20  P4(p, (int)(pOp 
7760: 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20  - p->aOp), zP4, 
7770: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
7780: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
7790: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
77a0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
77b0: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
77c0: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
77d0: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
77e0: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
77f0: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  MIC;.  }.}.void 
7800: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7810: 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP4(Vdbe *p, int
7820: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
7830: 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP4, int n){.
7840: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c    Op *pOp;.  sql
7850: 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65  ite3 *db;.  asse
7860: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
7870: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
7880: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
7890: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
78a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
78b0: 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p!=0 || db->mall
78c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
78d0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
78e0: 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21  ed ){.    if( n!
78f0: 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 65 50  =P4_VTAB ) freeP
7900: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
7910: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
7920: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7930: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
7940: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
7950: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
7960: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
7970: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
7980: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
7990: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
79a0: 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70  .  if( n>=0 || p
79b0: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
79c0: 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75    vdbeChangeP4Fu
79d0: 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20  ll(p, pOp, zP4, 
79e0: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  n);.    return;.
79f0: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f    }.  if( n==P4_
7a00: 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20  INT32 ){.    /* 
7a10: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20  Note: this cast 
7a20: 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65  is safe, because
7a30: 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61   the origin data
7a40: 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e   point was an in
7a50: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61  t.    ** that wa
7a60: 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e  s cast to a (con
7a70: 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20  st char *). */. 
7a80: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53     pOp->p4.i = S
7a90: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
7aa0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
7ab0: 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33  p4type = P4_INT3
7ac0: 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  2;.  }else if( z
7ad0: 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  P4!=0 ){.    ass
7ae0: 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20  ert( n<0 );.    
7af0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
7b00: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
7b10: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
7b20: 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66  d char)n;.    if
7b30: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73  ( n==P4_VTAB ) s
7b40: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
7b50: 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20  VTable*)zP4);.  
7b60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
7b70: 65 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  e the P4 operand
7b80: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
7b90: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
7ba0: 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20 74  ruction .** to t
7bb0: 68 65 20 76 61 6c 75 65 20 64 65 66 69 6e 65 64  he value defined
7bc0: 20 62 79 20 74 68 65 20 61 72 67 75 6d 65 6e 74   by the argument
7bd0: 73 2e 20 20 54 68 69 73 20 69 73 20 61 20 68 69  s.  This is a hi
7be0: 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65 72 73  gh-speed.** vers
7bf0: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
7c00: 62 65 43 68 61 6e 67 65 50 34 28 29 2e 0a 2a 2a  beChangeP4()..**
7c10: 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61  .** The P4 opera
7c20: 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  nd must not have
7c30: 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
7c40: 20 64 65 66 69 6e 65 64 2e 20 20 41 6e 64 20 74   defined.  And t
7c50: 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d 75 73  he new.** P4 mus
7c60: 74 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e 54 33  t not be P4_INT3
7c70: 32 2e 20 20 55 73 65 20 73 71 6c 69 74 65 33 56  2.  Use sqlite3V
7c80: 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 69 6e  dbeChangeP4() in
7c90: 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 74 68   either of.** th
7ca0: 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a 76 6f  ose cases..*/.vo
7cb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 70  id sqlite3VdbeAp
7cc0: 70 65 6e 64 50 34 28 56 64 62 65 20 2a 70 2c 20  pendP4(Vdbe *p, 
7cd0: 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74 20 6e  void *pP4, int n
7ce0: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
7cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 50  ;.  assert( n!=P
7d00: 34 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d 50 34  4_INT32 && n!=P4
7d10: 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72  _VTAB );.  asser
7d20: 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 66 28  t( n<=0 );.  if(
7d30: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
7d40: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 72 65 65  iled ){.    free
7d50: 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 50 34  P4(p->db, n, pP4
7d60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7d70: 61 73 73 65 72 74 28 20 70 50 34 21 3d 30 20 29  assert( pP4!=0 )
7d80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
7d90: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 4f  >nOp>0 );.    pO
7da0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  p = &p->aOp[p->n
7db0: 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  Op-1];.    asser
7dc0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
7dd0: 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 20 20  P4_NOTUSED );.  
7de0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7df0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  n;.    pOp->p4.p
7e00: 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pP4;.  }.}../
7e10: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20  *.** Set the P4 
7e20: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
7e30: 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64  ntly added opcod
7e40: 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f  e to the KeyInfo
7e50: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65   for the.** inde
7e60: 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  x given..*/.void
7e70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
7e80: 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  4KeyInfo(Parse *
7e90: 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
7ea0: 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Idx){.  Vdbe *v 
7eb0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7ec0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
7ed0: 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20  Info;.  assert( 
7ee0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
7ef0: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 70  ( pIdx!=0 );.  p
7f00: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
7f10: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
7f20: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20  pParse, pIdx);. 
7f30: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 20   if( pKeyInfo ) 
7f40: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
7f50: 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c  dP4(v, pKeyInfo,
7f60: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a   P4_KEYINFO);.}.
7f70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7f80: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
7f90: 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61  MMENTS./*.** Cha
7fa0: 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  nge the comment 
7fb0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
7fc0: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
7fd0: 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69  uction.  Or.** i
7fe0: 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e  nsert a No-op an
7ff0: 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e  d add the commen
8000: 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e  t to that new in
8010: 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73  struction.  This
8020: 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f  .** makes the co
8030: 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61  de easier to rea
8040: 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69  d during debuggi
8050: 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69  ng.  None of thi
8060: 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20  s happens.** in 
8070: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  a production bui
8080: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
8090: 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28  id vdbeVComment(
80a0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
80b0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
80c0: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73  _list ap){.  ass
80d0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
80e0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
80f0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
8100: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
8110: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
8120: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
8130: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
8140: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
8150: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29  assert( p->aOp )
8160: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
8170: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f  ree(p->db, p->aO
8180: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
8190: 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  ment);.    p->aO
81a0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
81b0: 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d  ment = sqlite3VM
81c0: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
81d0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a  ormat, ap);.  }.
81e0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
81f0: 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  beComment(Vdbe *
8200: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
8210: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
8220: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
8230: 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74  ( p ){.    va_st
8240: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
8250: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
8260: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
8270: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
8280: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
8290: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
82a0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
82b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
82c0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
82d0: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
82e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
82f0: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e  beAddOp0(p, OP_N
8300: 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61  oop);.    va_sta
8310: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
8320: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
8330: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
8340: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
8350: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
8360: 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23   /* NDEBUG */..#
8370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
8380: 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a  E_COVERAGE./*.**
8390: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69   Set the value i
83a0: 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66  f the iSrcLine f
83b0: 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65  ield for the pre
83c0: 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e  viously coded in
83d0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
83e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
83f0: 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65  tLineNumber(Vdbe
8400: 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b   *v, int iLine){
8410: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
8420: 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c  tOp(v,-1)->iSrcL
8430: 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23  ine = iLine;.}.#
8440: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8450: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f  VDBE_COVERAGE */
8460: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8470: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
8480: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
8490: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
84a0: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
84b0: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
84c0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
84d0: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
84e0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
84f0: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
8500: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
8510: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
8520: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
8530: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
8540: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
8550: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
8560: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
8570: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
8580: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
8590: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
85a0: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
85b0: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
85c0: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
85d0: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
85e0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
85f0: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
8600: 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d  .** after an OOM
8610: 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68   fault without h
8620: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
8630: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
8640: 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69  urn from .** thi
8650: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
8660: 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42  alid pointer.  B
8670: 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ut because the d
8680: 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30  ummy.opcode is 0
8690: 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20  ,.** dummy will 
86a0: 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e  never be written
86b0: 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65   to.  This is ve
86c0: 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69  rified by code i
86d0: 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  nspection and.**
86e0: 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68   by running with
86f0: 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64   Valgrind..*/.Vd
8700: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
8710: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
8720: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
8730: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
8740: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
8750: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
8760: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8770: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
8780: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
8790: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
87a0: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
87b0: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
87c0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
87d0: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
87e0: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
87f0: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
8800: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
8810: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
8820: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
8830: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
8840: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
8850: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
8860: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
8870: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
8880: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8890: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
88a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
88b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
88c0: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
88d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
88e0: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
88f0: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  ];.  }.}..#if de
8900: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8910: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
8920: 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ENTS)./*.** Retu
8930: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  rn an integer va
8940: 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  lue for one of t
8950: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
8960: 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a   the opcode pOp.
8970: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
8980: 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f   character c..*/
8990: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
89a0: 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63  slateP(char c, c
89b0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20  onst Op *pOp){. 
89c0: 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65   if( c=='1' ) re
89d0: 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  turn pOp->p1;.  
89e0: 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74  if( c=='2' ) ret
89f0: 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69  urn pOp->p2;.  i
8a00: 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75  f( c=='3' ) retu
8a10: 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  rn pOp->p3;.  if
8a20: 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72  ( c=='4' ) retur
8a30: 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72  n pOp->p4.i;.  r
8a40: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d  eturn pOp->p5;.}
8a50: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
8a60: 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  a string for the
8a70: 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64   "comment" field
8a80: 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64   of a VDBE opcod
8a90: 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e listing..**.**
8aa0: 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66   The Synopsis: f
8ab0: 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73  ield in comments
8ac0: 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73   in the vdbe.c s
8ad0: 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20  ource file gets 
8ae0: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
8af0: 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20  an extra string 
8b00: 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64  that is appended
8b10: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f   to the sqlite3O
8b20: 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e  pcodeName().  In
8b30: 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20   the.** absence 
8b40: 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74  of other comment
8b50: 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73  s, this synopsis
8b60: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d   becomes the com
8b70: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f  ment on the opco
8b80: 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e  de..** Some tran
8b90: 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a  slation occurs:.
8ba0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22  **.**       "PX"
8bb0: 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22        ->  "r[X]"
8bc0: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
8bd0: 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  "   ->  "r[X..X+
8be0: 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22  Y-1]"  or "r[x]"
8bf0: 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a   if y is 0 or 1.
8c00: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b  **       "PX@PY+
8c10: 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59  1" ->  "r[X..X+Y
8c20: 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20  ]"    or "r[x]" 
8c30: 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20  if y is 0.**    
8c40: 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20     "PY..PY"  -> 
8c50: 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20   "r[X..Y]"      
8c60: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d  or "r[x]" if y<=
8c70: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  x.*/.static int 
8c80: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a  displayComment(.
8c90: 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c    const Op *pOp,
8ca0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
8cb0: 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74  de to be comment
8cc0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
8cd0: 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72  ar *zP4,   /* Pr
8ce0: 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65  eviously obtaine
8cf0: 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a  d value for P4 *
8d00: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  /.  char *zTemp,
8d10: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
8d20: 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20  result here */. 
8d30: 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20   int nTemp      
8d40: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61      /* Space ava
8d50: 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b  ilable in zTemp[
8d60: 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ] */.){.  const 
8d70: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20  char *zOpName;. 
8d80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
8d90: 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f  nopsis;.  int nO
8da0: 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c  pName;.  int ii,
8db0: 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74   jj;.  char zAlt
8dc0: 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20  [50];.  zOpName 
8dd0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  = sqlite3OpcodeN
8de0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
8df0: 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  nOpName = sq
8e00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
8e10: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f  pName);.  if( zO
8e20: 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d  pName[nOpName+1]
8e30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
8e40: 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  Com = 0;.    cha
8e50: 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73  r c;.    zSynops
8e60: 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20  is = zOpName += 
8e70: 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20  nOpName + 1;.   
8e80: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
8e90: 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 29 3d  nopsis,"IF ",3)=
8ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
8eb0: 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
8ec0: 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20  _STOREP2 ){.    
8ed0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8ee0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74  intf(sizeof(zAlt
8ef0: 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20  ), zAlt, "r[P2] 
8f00: 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73  = (%s)", zSynops
8f10: 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c  is+3);.      }el
8f20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8f30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
8f40: 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c  eof(zAlt), zAlt,
8f50: 20 22 69 66 20 25 73 20 67 6f 74 6f 20 50 32 22   "if %s goto P2"
8f60: 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a  , zSynopsis+3);.
8f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
8f80: 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a  ynopsis = zAlt;.
8f90: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
8fa0: 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d  =jj=0; jj<nTemp-
8fb0: 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70  1 && (c = zSynop
8fc0: 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b  sis[ii])!=0; ii+
8fd0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  +){.      if( c=
8fe0: 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='P' ){.        
8ff0: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b  c = zSynopsis[++
9000: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii];.        if(
9010: 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20   c=='4' ){.     
9020: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
9030: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
9040: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
9050: 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  zP4);.        }e
9060: 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29  lse if( c=='X' )
9070: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9080: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9090: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
90a0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
90b0: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
90c0: 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20   seenCom = 1;.  
90d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
90e0: 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20         int v1 = 
90f0: 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f  translateP(c, pO
9100: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  p);.          in
9110: 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20  t v2;.          
9120: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9130: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
9140: 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a  +jj, "%d", v1);.
9150: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
9160: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
9170: 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d  ii+1, "@P", 2)==
9180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
9190: 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20   ii += 3;.      
91a0: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
91b0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
91c0: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  p+jj);.         
91d0: 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74     v2 = translat
91e0: 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d  eP(zSynopsis[ii]
91f0: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
9200: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9210: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22  zSynopsis+ii+1,"
9220: 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  +1",2)==0 ){.   
9230: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
9240: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
9250: 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20    v2++;.        
9260: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9270: 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20    if( v2>1 ){.  
9280: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9290: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
92a0: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
92b0: 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31   "..%d", v1+v2-1
92c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
92d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
92e0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
92f0: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e  nopsis+ii+1, "..
9300: 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f  P3", 4)==0 && pO
9310: 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p3==0 ){.    
9320: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b          ii += 4;
9330: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a       }.        j
9350: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
9360: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
9370: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9380: 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d       zTemp[jj++]
9390: 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = c;.      }.  
93a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65    }.    if( !see
93b0: 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70  nCom && jj<nTemp
93c0: 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  -5 && pOp->zComm
93d0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
93e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
93f0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
9400: 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a  , "; %s", pOp->z
9410: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
9420: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
9430: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
9440: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
9450: 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b  j<nTemp ) zTemp[
9460: 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  jj] = 0;.  }else
9470: 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65   if( pOp->zComme
9480: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
9490: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
94a0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70  , zTemp, "%s", p
94b0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
94c0: 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53     jj = sqlite3S
94d0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
94e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65    }else{.    zTe
94f0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a  mp[0] = 0;.    j
9500: 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  j = 0;.  }.  ret
9510: 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66  urn jj;.}.#endif
9520: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
9530: 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49   */..#if VDBE_DI
9540: 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69  SPLAY_P4 && defi
9550: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9560: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a  E_CURSOR_HINTS).
9570: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
9580: 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c  the P4.pExpr val
9590: 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72  ue for an OP_Cur
95a0: 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69  sorHint opcode i
95b0: 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74  nto text.** that
95c0: 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65   can be displaye
95d0: 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75  d in the P4 colu
95e0: 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75  mn of EXPLAIN ou
95f0: 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tput..*/.static 
9600: 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45 78  void displayP4Ex
9610: 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20  pr(StrAccum *p, 
9620: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
9630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
9640: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  = 0;.  switch( p
9650: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
9660: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
9670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9680: 69 6e 74 66 28 70 2c 20 22 25 51 22 2c 20 70 45  intf(p, "%Q", pE
9690: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
96a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
96b0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
96c0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
96d0: 50 72 69 6e 74 66 28 70 2c 20 22 25 64 22 2c 20  Printf(p, "%d", 
96e0: 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29  pExpr->u.iValue)
96f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9700: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
9710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
9720: 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29  rintf(p, "NULL")
9730: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9740: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
9750: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
9760: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
9770: 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69  r[%d]", pExpr->i
9780: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
9790: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
97a0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
97b0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
97c0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
97d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
97e0: 72 69 6e 74 66 28 70 2c 20 22 72 6f 77 69 64 22  rintf(p, "rowid"
97f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
9810: 50 72 69 6e 74 66 28 70 2c 20 22 63 25 64 22 2c  Printf(p, "c%d",
9820: 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f   (int)pExpr->iCo
9830: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
9840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9850: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
9860: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54  :      zOp = "LT
9870: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9880: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
9890: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20      zOp = "LE"; 
98a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
98b0: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
98c0: 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20   zOp = "GT";    
98d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
98e0: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f  e TK_GE:      zO
98f0: 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62  p = "GE";      b
9900: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9910: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_NE:      zOp =
9920: 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61   "NE";      brea
9930: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
9940: 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  Q:      zOp = "E
9950: 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  Q";      break;.
9960: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
9970: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b       zOp = "IS";
9980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9990: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
99a0: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b    zOp = "ISNOT";
99b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
99c0: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
99d0: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20  Op = "AND";     
99e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
99f0: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20  TK_OR:      zOp 
9a00: 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65  = "OR";      bre
9a10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9a20: 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22  PLUS:    zOp = "
9a30: 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ADD";     break;
9a40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
9a50: 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c  R:    zOp = "MUL
9a60: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9a70: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
9a80: 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20     zOp = "SUB"; 
9a90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9aa0: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
9ab0: 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  zOp = "REM";    
9ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ad0: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70   TK_BITAND:  zOp
9ae0: 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72   = "BITAND";  br
9af0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9b00: 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20  _BITOR:   zOp = 
9b10: 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b  "BITOR";   break
9b20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
9b30: 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49  ASH:   zOp = "DI
9b40: 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  V";     break;. 
9b50: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
9b60: 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46  T:  zOp = "LSHIF
9b70: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
9b80: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
9b90: 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b   zOp = "RSHIFT";
9ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9bb0: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f  e TK_CONCAT:  zO
9bc0: 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62  p = "CONCAT";  b
9bd0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9be0: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d  K_UMINUS:  zOp =
9bf0: 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61   "MINUS";   brea
9c00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
9c10: 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50  PLUS:   zOp = "P
9c20: 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  LUS";    break;.
9c30: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
9c40: 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e  OT:  zOp = "BITN
9c50: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
9c60: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
9c70: 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20    zOp = "NOT";  
9c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9c90: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
9ca0: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20  Op = "ISNULL";  
9cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9cc0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20  TK_NOTNULL: zOp 
9cd0: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
9ce0: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
9cf0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
9d00: 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20  Printf(p, "%s", 
9d10: 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62  "expr");.      b
9d20: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
9d30: 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69   zOp ){.    sqli
9d40: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
9d50: 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64  s(", zOp);.    d
9d60: 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20  isplayP4Expr(p, 
9d70: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9d80: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
9d90: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
9da0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
9db0: 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a  end(p, ",", 1);.
9dc0: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
9dd0: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52  xpr(p, pExpr->pR
9de0: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
9df0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
9e00: 41 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31  Append(p, ")", 1
9e10: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9e20: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
9e30: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
9e40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
9e50: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
9e60: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
9e70: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
9e80: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
9e90: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
9ea0: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
9eb0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
9ec0: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
9ed0: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
9ee0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
9ef0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
9f00: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
9f10: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
9f20: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
9f30: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
9f40: 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20    StrAccum x;.  
9f50: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
9f60: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  0 );.  sqlite3St
9f70: 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30  rAccumInit(&x, 0
9f80: 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20  , zTemp, nTemp, 
9f90: 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f  0);.  switch( pO
9fa0: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
9fb0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
9fc0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  : {.      int j;
9fd0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
9fe0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
9ff0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
a000: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
a010: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
a020: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
a030: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
a040: 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  k(%d", pKeyInfo-
a050: 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a 20 20 20  >nKeyField);.   
a060: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
a070: 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
a080: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
a090: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
a0a0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
a0b0: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f  l[j];.        co
a0c0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
a0d0: 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d  = pColl ? pColl-
a0e0: 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20  >zName : "";.   
a0f0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
a100: 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29  zColl, "BINARY")
a110: 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42  ==0 ) zColl = "B
a120: 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ";.        sqlit
a130: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c  e3XPrintf(&x, ",
a140: 25 73 25 73 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  %s%s", pKeyInfo-
a150: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f  >aSortOrder[j] ?
a160: 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c   "-" : "", zColl
a170: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a180: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
a190: 41 70 70 65 6e 64 28 26 78 2c 20 22 29 22 2c 20  Append(&x, ")", 
a1a0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
a1b0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
a1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
a1d0: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
a1e0: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
a1f0: 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72     displayP4Expr
a200: 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78  (&x, pOp->p4.pEx
a210: 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pr);.      break
a220: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a230: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
a240: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
a250: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
a260: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
a270: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
a280: 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c 20  (&x, "(%.20s)", 
a290: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
a2a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a2b0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
a2c0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
a2d0: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
a2e0: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
a2f0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
a300: 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  tf(&x, "%s(%d)",
a310: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
a320: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
a330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
a340: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a350: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
a360: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
a370: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
a380: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75  CCTX: {.      Fu
a390: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
a3a0: 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e  p->p4.pCtx->pFun
a3b0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
a3c0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28  XPrintf(&x, "%s(
a3d0: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
a3e0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
a3f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a400: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
a410: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
a420: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
a430: 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ntf(&x, "%lld", 
a440: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
a450: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a460: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
a470: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
a480: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
a490: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
a4a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a4b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
a4c0: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
a4d0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
a4e0: 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  x, "%.16g", *pOp
a4f0: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
a500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a510: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
a520: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
a530: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
a540: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
a550: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
a560: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
a570: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
a580: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
a590: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
a5a0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
a5b0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
a5c0: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
a5d0: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
a5e0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
a5f0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
a600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
a610: 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67  rintf(&x, "%.16g
a620: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20  ", pMem->u.r);. 
a630: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
a640: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
a650: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Null ){.       
a660: 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20   zP4 = "NULL";. 
a670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a680: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
a690: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
a6a0: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
a6b0: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
a6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a6d0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
a6e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
a6f0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
a700: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
a710: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
a720: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
a730: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
a740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
a750: 69 6e 74 66 28 26 78 2c 20 22 76 74 61 62 3a 25  intf(&x, "vtab:%
a760: 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  p", pVtab);.    
a770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a780: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
a790: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
a7a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a7b0: 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e   int *ai = pOp->
a7c0: 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74  p4.ai;.      int
a7d0: 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a   n = ai[0];   /*
a7e0: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
a7f0: 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41  nt of an INTARRA
a800: 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a  Y is always the.
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20         ** count 
a830: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a840: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c   elements to fol
a850: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  low */.      for
a860: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
a870: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a880: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25  3XPrintf(&x, ",%
a890: 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20  d", ai[i]);.    
a8a0: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
a8b0: 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20  0] = '[';.      
a8c0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
a8d0: 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31  ppend(&x, "]", 1
a8e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a8f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
a900: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
a910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
a920: 69 6e 74 66 28 26 78 2c 20 22 70 72 6f 67 72 61  intf(&x, "progra
a930: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
a940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a950: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
a960: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
a970: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
a980: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
a990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a9a0: 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a  ase P4_TABLE: {.
a9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
a9c0: 69 6e 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70  intf(&x, "%s", p
a9d0: 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61  Op->p4.pTab->zNa
a9e0: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
a9f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
aa00: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
aa10: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
aa20: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29      if( zP4==0 )
aa30: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
aa40: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
aa50: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
aa60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
aa70: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
aa80: 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73  Finish(&x);.  as
aa90: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
aaa0: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
aab0: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
aac0: 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a  ISPLAY_P4 */../*
aad0: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
aae0: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
aaf0: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
ab00: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
ab10: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  sed..**.** The p
ab20: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ab30: 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ts need to know 
ab40: 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63  in advance the c
ab50: 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a  omplete set of.*
ab60: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
ab70: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ases that will b
ab80: 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f  e use.  A mask o
ab90: 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65  f these database
aba0: 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e  s.** is maintain
abb0: 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ed in p->btreeMa
abc0: 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b  sk.  The p->lock
abd0: 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68  Mask value is th
abe0: 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70  e subset of.** p
abf0: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64  ->btreeMask of d
ac00: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
ac10: 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63  ll require a loc
ac20: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
ac30: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
ac40: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b  Vdbe *p, int i){
ac50: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
ac60: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
ac70: 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  && i<(int)sizeof
ac80: 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  (yDbMask)*8 );. 
ac90: 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29   assert( i<(int)
aca0: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
acb0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61  ask)*8 );.  DbMa
acc0: 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61  skSet(p->btreeMa
acd0: 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21  sk, i);.  if( i!
ace0: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
acf0: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
ad00: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
ad10: 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
ad20: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a  ->lockMask, i);.
ad30: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
ad40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ad50: 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a  SHARED_CACHE)./*
ad60: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
ad70: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70   compiled to sup
ad80: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
ad90: 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65  e mode and to be
ada0: 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20   threadsafe,.** 
adb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74  this routine obt
adc0: 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61  ains the mutex a
add0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
ade0: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
adf0: 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d  ucture.** that m
ae00: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ay be accessed b
ae10: 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
ae20: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
ae30: 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61  In doing so it a
ae40: 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  lso.** sets the 
ae50: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
ae60: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
ae70: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
ae80: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
ae90: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
aea0: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
aeb0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
aec0: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
aed0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
aee0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
aef0: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
af00: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
af10: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
af20: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
af30: 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  r() is invoked t
af40: 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72  o set the BtShar
af50: 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a  ed.db variables.
af60: 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53  ** of all of BtS
af70: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
af80: 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20   accessible via 
af90: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
afa0: 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74  dle .** associat
afb0: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a  ed with the VM..
afc0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
afd0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
afe0: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73  e and does not s
aff0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
b000: 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a  che mode, this.*
b010: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
b020: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
b030: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69   p->btreeMask fi
b040: 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b  eld is a bitmask
b050: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74   of all btrees t
b060: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
b070: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70   .** statement p
b080: 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20   will ever use. 
b090: 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75   Let N be the nu
b0a0: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
b0b0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20  p->btreeMask.** 
b0c0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b0d0: 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65   btrees that use
b0e0: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
b0f0: 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65  Then the runtime
b100: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   of.** this rout
b110: 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74  ine is N*N.  But
b120: 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20   as N is rarely 
b130: 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69  more than 1, thi
b140: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  s should not.** 
b150: 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
b160: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b170: 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  eEnter(Vdbe *p){
b180: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
b190: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
b1a0: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
b1b0: 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   if( DbMaskAllZe
b1c0: 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20  ro(p->lockMask) 
b1d0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
b1e0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
b1f0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
b200: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
b210: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
b220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
b230: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
b240: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
b250: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
b260: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
b270: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
b280: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
b290: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42  eEnter(aDb[i].pB
b2a0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
b2b0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
b2c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b2d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
b2e0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
b2f0: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  AFE>0./*.** Unlo
b300: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74  ck all of the bt
b310: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20  rees previously 
b320: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c  locked by a call
b330: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
b340: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  nter()..*/.stati
b350: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
b360: 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65  E void vdbeLeave
b370: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
b380: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
b390: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
b3a0: 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20  int nDb;.  db = 
b3b0: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
b3c0: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
b3d0: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
b3e0: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
b3f0: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
b400: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
b410: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
b420: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
b430: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
b440: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61  ite3BtreeLeave(a
b450: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
b460: 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
b470: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
b480: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62  be *p){.  if( Db
b490: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
b4a0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
b4b0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
b4c0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65  n case */.  vdbe
b4d0: 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64  Leave(p);.}.#end
b4e0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
b4f0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
b500: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b510: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
b520: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
b530: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
b540: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
b550: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
b560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b570: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
b580: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
b590: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
b5a0: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
b5b0: 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d  50];.  char zCom
b5c0: 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  [100];.  static 
b5d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
b5e0: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
b5f0: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
b600: 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  13s %.2X %s\n";.
b610: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
b620: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
b630: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
b640: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
b650: 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65  of(zPtr));.#ifde
b660: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b670: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
b680: 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  .  displayCommen
b690: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d  t(pOp, zP4, zCom
b6a0: 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b  , sizeof(zCom));
b6b0: 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d  .#else.  zCom[0]
b6c0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f   = 0;.#endif.  /
b6d0: 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74  * NB:  The sqlit
b6e0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66  e3OpcodeName() f
b6f0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
b700: 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63  mented by code c
b710: 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74  reated.  ** by t
b720: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
b730: 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61   and mkopcodec.a
b740: 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68  wk scripts which
b750: 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a   extract the.  *
b760: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
b770: 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  om the vdbe.c so
b780: 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66  urce text */.  f
b790: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
b7a0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
b7b0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
b7c0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
b7d0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
b7e0: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
b7f0: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20  , pOp->p5,.     
b800: 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c   zCom.  );.  ffl
b810: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
b820: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
b830: 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f  alize an array o
b840: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e  f N Mem element.
b850: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b860: 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d  initMemArray(Mem
b870: 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69   *p, int N, sqli
b880: 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61  te3 *db, u16 fla
b890: 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e  gs){.  while( (N
b8a0: 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  --)>0 ){.    p->
b8b0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e  db = db;.    p->
b8c0: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
b8d0: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
b8e0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
b8f0: 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70  E_DEBUG.    p->p
b900: 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23  ScopyFrom = 0;.#
b910: 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20  endif.    p++;. 
b920: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
b930: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
b940: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
b950: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
b960: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
b970: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
b980: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20  if( p && N ){.  
b990: 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70    Mem *pEnd = &p
b9a0: 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [N];.    sqlite3
b9b0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
b9c0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
b9d0: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
b9e0: 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
b9f0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
ba00: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ba10: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
ba20: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
ba30: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72  <pEnd );.      r
ba40: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
ba50: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72   do{.      asser
ba60: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
ba70: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
ba80: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73  ].db );.      as
ba90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
baa0: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
bab0: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
bac0: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
bad0: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
bae0: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
baf0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
bb00: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
bb10: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
bb20: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
bb30: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
bb40: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
bb50: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
bb60: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
bb70: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
bb80: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
bb90: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
bba0: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
bbb0: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
bbc0: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
bbd0: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
bbe0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
bbf0: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
bc00: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
bc10: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
bc20: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
bc30: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
bc40: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
bc50: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
bc60: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
bc70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
bc80: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
bc90: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
bca0: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
bcb0: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
bcc0: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
bcd0: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
bce0: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
bcf0: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
bd00: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
bd10: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
bd20: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
bd30: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
bd40: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
bd50: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
bd60: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
bd70: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
bd80: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
bd90: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
bda0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
bdb0: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74  M_Agg );.      t
bdc0: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
bdd0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
bde0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bdf0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72  ->flags & MEM_Fr
be00: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ame );.      tes
be10: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
be20: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a  & MEM_RowSet );.
be30: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
be40: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
be50: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
be60: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
be70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
be80: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
be90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
bea0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  ->szMalloc ){.  
beb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
bec0: 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61  reeNN(db, p->zMa
bed0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
bee0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
bef0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
bf00: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e  ->flags = MEM_Un
bf10: 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68  defined;.    }wh
bf20: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
bf30: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
bf40: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
bf50: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
bf60: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
bf70: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
bf80: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
bf90: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
bfa0: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
bfb0: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
bfc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bfd0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
bfe0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
bff0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
c000: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
c010: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
c020: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
c030: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
c040: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
c050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
c060: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
c070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
c080: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
c090: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
c0a0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c0b0: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
c0c0: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Mem);.  sqlite3V
c0d0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
c0e0: 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70  (p->v->db, &p->p
c0f0: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
c100: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
c110: 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d  (p->v->db, p);.}
c120: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c130: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
c140: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
c150: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
c160: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
c170: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
c180: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
c190: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
c1a0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
c1b0: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
c1c0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
c1d0: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
c1e0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
c1f0: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
c200: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
c210: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
c220: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
c230: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
c240: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
c250: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
c260: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
c270: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
c280: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
c290: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
c2a0: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
c2b0: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
c2c0: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
c2d0: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
c2e0: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
c2f0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
c300: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
c310: 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   PLAN..**.** Whe
c320: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
c330: 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20   first the main 
c340: 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65  program is liste
c350: 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a  d, then each of.
c360: 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73  ** the trigger s
c370: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c  ubprograms are l
c380: 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65  isted one by one
c390: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c3a0: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
c3b0: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
c3c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
c3d0: 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  E */.){.  int nR
c3e0: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c400: 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20  * Stop when row 
c410: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68  count reaches th
c420: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  is */.  int nSub
c430: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c450: 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64  Number of sub-vd
c460: 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20  bes seen so far 
c470: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
c480: 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20  **apSub = 0;    
c490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
c4a0: 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  ay of sub-vdbes 
c4b0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d  */.  Mem *pSub =
c4c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
c4e0: 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72  ory cell hold ar
c4f0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20  ray of subprogs 
c500: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
c510: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
c520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c530: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
c540: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  tion */.  int i;
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c570: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
c580: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
c590: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
c5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
c5b0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
c5c0: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
c5d0: 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  m[1];           
c5e0: 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f    /* First Mem o
c5f0: 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  f result set */.
c600: 20 20 69 6e 74 20 62 4c 69 73 74 53 75 62 70 72    int bListSubpr
c610: 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61 69  ogs = (p->explai
c620: 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c 61  n==1 || (db->fla
c630: 67 73 20 26 20 53 51 4c 49 54 45 5f 54 72 69 67  gs & SQLITE_Trig
c640: 67 65 72 45 51 50 29 21 3d 30 29 3b 0a 20 20 4f  gerEQP)!=0);.  O
c650: 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20 61  p *pOp = 0;..  a
c660: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
c670: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
c680: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
c690: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
c6a0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
c6b0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
c6c0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
c6d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
c6e0: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
c6f0: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
c700: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
c710: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
c720: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
c730: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
c740: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
c750: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
c760: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
c770: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
c780: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
c790: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
c7a0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
c7b0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
c7c0: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
c7d0: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
c7e0: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
c7f0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
c800: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
c810: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
c820: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
c830: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c840: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
c850: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
c860: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
c870: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
c880: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
c890: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
c8a0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c8b0: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
c8c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
c8d0: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
c8e0: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
c8f0: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
c900: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
c910: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
c920: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
c930: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
c940: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
c950: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
c960: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
c970: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
c980: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
c990: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
c9a0: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
c9b0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
c9c0: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
c9d0: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
c9e0: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
c9f0: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
ca00: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
ca10: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
ca20: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
ca30: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
ca40: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
ca50: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
ca60: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
ca70: 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 29 7b  bListSubprogs ){
ca80: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
ca90: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
caa0: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
cab0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
cac0: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
cad0: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
cae0: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
caf0: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
cb00: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
cb10: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
cb20: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
cb30: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
cb40: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
cb50: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
cb60: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
cb70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
cb80: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
cb90: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
cba0: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
cbb0: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
cbc0: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
cbd0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
cbe0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
cbf0: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
cc00: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
cc10: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
cc20: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
cc30: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
cc40: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
cc50: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
cc60: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
cc70: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
cc80: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
cc90: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
cca0: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
ccb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
ccc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
ccd0: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
cce0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
ccf0: 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70  do{.    i = p->p
cd00: 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  c++;.    if( i>=
cd10: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  nRow ){.      p-
cd20: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
cd30: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
cd40: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 62  TE_DONE;.      b
cd50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cd60: 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a  if( i<p->nOp ){.
cd70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74        /* The out
cd80: 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  put line number 
cd90: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
cda0: 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c  that we are stil
cdb0: 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  l in the.      *
cdc0: 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20  * main program. 
cdd0: 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26  */.      pOp = &
cde0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  p->aOp[i];.    }
cdf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
ce00: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
ce10: 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72  listing subprogr
ce20: 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74  ams.  Figure out
ce30: 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20   which one and. 
ce40: 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20       ** pick up 
ce50: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
ce60: 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  opcode. */.     
ce70: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20   int j;.      i 
ce80: 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  -= p->nOp;.     
ce90: 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53   for(j=0; i>=apS
cea0: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29  ub[j]->nOp; j++)
ceb0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61  {.        i -= a
cec0: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[j]->nOp;.  
ced0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20      }.      pOp 
cee0: 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70  = &apSub[j]->aOp
cef0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  [i];.    }..    
cf00: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
cf10: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
cf20: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
cf30: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
cf40: 68 61 73 0a 20 20 20 20 2a 2a 20 61 20 50 34 5f  has.    ** a P4_
cf50: 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d  SUBPROGRAM argum
cf60: 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65  ent), expand the
cf70: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
cf80: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
cf90: 73 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e  s.    ** kept in
cfa0: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
cfb0: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
cfc0: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
cfd0: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
cfe0: 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
cff0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65  already been see
d000: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
d010: 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20  ( bListSubprogs 
d020: 26 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  && pOp->p4type==
d030: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
d040: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
d050: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
d060: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
d070: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
d080: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
d090: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
d0a0: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
d0b0: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
d0c0: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
d0d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
d0e0: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
d0f0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 56  p->rc = sqlite3V
d100: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
d110: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
d120: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
d130: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
d140: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
d150: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
d160: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d170: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d180: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
d190: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
d1a0: 3b 0a 20 20 20 20 20 20 20 20 61 70 53 75 62 5b  ;.        apSub[
d1b0: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
d1c0: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
d1d0: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
d1e0: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
d1f0: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
d200: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
d210: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
d220: 20 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d 3e 70 34   nRow += pOp->p4
d230: 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a  .pProgram->nOp;.
d240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d250: 7d 77 68 69 6c 65 28 20 70 2d 3e 65 78 70 6c 61  }while( p->expla
d260: 69 6e 3d 3d 32 20 26 26 20 70 4f 70 2d 3e 6f 70  in==2 && pOp->op
d270: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
d280: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
d290: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d2a0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
d2b0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
d2c0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
d2d0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
d2e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
d2f0: 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
d300: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73  e3VdbeError(p, s
d310: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
d320: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
d330: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 34  .      char *zP4
d340: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  ;.      if( p->e
d350: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
d360: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
d370: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
d380: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
d390: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
d3c0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  nter */.        
d3d0: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20 20  pMem++;.    .   
d3e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
d3f0: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
d400: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
d410: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
d420: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
d430: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
d440: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
d450: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  de */.        as
d460: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
d470: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   );.        pMem
d480: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
d490: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
d4a0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
d4b0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
d4c0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  .        pMem++;
d4d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d4e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
d4f0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
d500: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
d510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
d530: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
d540: 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ;..      pMem->f
d550: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
d560: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
d570: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
d5a0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
d5b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
d5c0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
d5d0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
d5e0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d600: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
d610: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73  ++;..      if( s
d620: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
d630: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
d640: 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20  , 100) ){ /* P4 
d650: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
d660: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
d670: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
d680: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d690: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
d6a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
d6b0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
d6c0: 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20 3d  erm;.      zP4 =
d6d0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
d6e0: 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73  pMem->z, pMem->s
d6f0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
d700: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
d710: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
d720: 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ->n = 0;.       
d730: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
d740: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
d750: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
d760: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
d770: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
d780: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
d790: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
d7a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
d7b0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
d7c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
d7d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
d7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
d7f0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ++;..      if( p
d800: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
d810: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
d820: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
d830: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
d840: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
d850: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
d860: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
d870: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d880: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
d890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
d8a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
d8b0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
d8c0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
d8d0: 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   2;.        sqli
d8e0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
d8f0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
d900: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
d910: 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  P5 */.        pM
d920: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
d930: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
d940: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66 64  Mem++;.    .#ifd
d950: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d960: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
d970: 53 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  S.        if( sq
d980: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
d990: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
d9a0: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20   500) ){.       
d9b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
d9c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d9d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
d9e0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
d9f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
da00: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
da10: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
da20: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
da30: 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d  >n = displayComm
da40: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d  ent(pOp, zP4, pM
da50: 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20  em->z, 500);.   
da60: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
da70: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
da80: 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  lse.        pMem
da90: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
daa0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
dab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
dac0: 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ment */.#endif. 
dad0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
dae0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
daf0: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
db00: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65  1);.      p->pRe
db10: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
db20: 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  em[1];.      p->
db30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
db40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
db50: 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20 7d  E_ROW;.    }.  }
db60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
db70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
db80: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
db90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
dba0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
dbb0: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
dbc0: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
dbd0: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
dbe0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
dbf0: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
dc00: 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73  Vdbe *p){.  cons
dc10: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20  t char *z = 0;. 
dc20: 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
dc30: 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b      z = p->zSql;
dc40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
dc50: 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f  nOp>=1 ){.    co
dc60: 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  nst VdbeOp *pOp 
dc70: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
dc80: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
dc90: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
dca0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
dcb0: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e      z = pOp->p4.
dcc0: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  z;.      while( 
dcd0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
dce0: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a  z) ) z++;.    }.
dcf0: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72    }.  if( z ) pr
dd00: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
dd10: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  n", z);.}.#endif
dd20: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
dd30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
dd40: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
dd50: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
dd60: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
dd70: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
dd80: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
dd90: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
dda0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
ddb0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
ddc0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
ddd0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
dde0: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
ddf0: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
de00: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
de10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
de20: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
de30: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
de40: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
de50: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
de60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
de70: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
de80: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
de90: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
dea0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
deb0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
dec0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
ded0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
dee0: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
def0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
df00: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
df10: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
df20: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
df30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
df40: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
df50: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
df60: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
df70: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
df80: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
df90: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
dfa0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
dfb0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
dfc0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
dfd0: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
dfe0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
dff0: 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73  CE */../* An ins
e000: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
e010: 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62  ject describes b
e020: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
e030: 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20  able for use.** 
e040: 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73  by subcomponents
e050: 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73   of a prepared s
e060: 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65  tatement.  Space
e070: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75   is allocated ou
e080: 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62  t.** of a Reusab
e090: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62  leSpace object b
e0a0: 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65  y the allocSpace
e0b0: 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77  () routine below
e0c0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73  ..*/.struct Reus
e0d0: 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38  ableSpace {.  u8
e0e0: 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
e0f0: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20     /* Available 
e100: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
e110: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
e120: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61   /* Bytes of ava
e130: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f  ilable memory */
e140: 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20  .  int nNeeded; 
e150: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
e160: 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c   bytes that coul
e170: 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  d not be allocat
e180: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79  ed */.};../* Try
e190: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79   to allocate nBy
e1a0: 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79  te bytes of 8-by
e1b0: 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20  te aligned bulk 
e1c0: 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a  memory for pBuf.
e1d0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73  ** from the Reus
e1e0: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
e1f0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
e200: 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
e210: 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f  ated.** memory o
e220: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69  n success.  If i
e230: 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f  nsufficient memo
e240: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
e250: 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62  in the.** Reusab
e260: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20  leSpace object, 
e270: 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75  increase the Reu
e280: 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64  sableSpace.nNeed
e290: 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74  ed.** value by t
e2a0: 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64  he amount needed
e2b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
e2c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20  ..**.** If pBuf 
e2d0: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79  is not initially
e2e0: 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e   NULL, that mean
e2f0: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  s that the memor
e300: 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  y has already.**
e310: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
e320: 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  by a prior call 
e330: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  to this routine,
e340: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
e350: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75  a copy.** of pBu
e360: 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73  f and leave Reus
e370: 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e  ableSpace unchan
e380: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ged..**.** This 
e390: 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70  allocator is emp
e3a0: 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f  loyed to repurpo
e3b0: 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20  se unused slots 
e3c0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
e3d0: 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61  e.** opcode arra
e3e0: 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  y of prepared st
e3f0: 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65  ate for other me
e400: 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68  mory needs of th
e410: 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  e prepared.** st
e420: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
e430: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
e440: 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65  ace(.  struct Re
e450: 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20  usableSpace *p, 
e460: 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20   /* Bulk memory 
e470: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
e480: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  location */.  vo
e490: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
e4a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
e4b0: 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c  er to a prior al
e4c0: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  location */.  in
e4d0: 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
e4e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
e4f0: 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
e500: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
e510: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
e520: 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65  GNMENT(p->pSpace
e530: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  ) );.  if( pBuf=
e540: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
e550: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
e560: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c  .    if( nByte <
e570: 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  = p->nFree ){.  
e580: 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20      p->nFree -= 
e590: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75  nByte;.      pBu
e5a0: 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70  f = &p->pSpace[p
e5b0: 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65  ->nFree];.    }e
e5c0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e  lse{.      p->nN
e5d0: 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a  eeded += nByte;.
e5e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
e5f0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
e600: 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29  LIGNMENT(pBuf) )
e610: 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
e620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64  .}../*.** Rewind
e630: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74   the VDBE back t
e640: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
e650: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
e660: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74  or.** running it
e670: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e680: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65  3VdbeRewind(Vdbe
e690: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
e6a0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
e6b0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
e6c0: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
e6d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
e6e0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
e6f0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
e700: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c  DBE_MAGIC_INIT |
e710: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
e720: 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a  _MAGIC_RESET );.
e730: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
e740: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
e750: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
e760: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
e770: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
e780: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
e790: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
e7a0: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
e7b0: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
e7c0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
e7d0: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51  _RUN;..#ifdef SQ
e7e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
e7f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=0; i<p->nMem;
e800: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
e810: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62  t( p->aMem[i].db
e820: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23  ==p->db );.  }.#
e830: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20  endif.  p->pc = 
e840: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
e850: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
e860: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
e870: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  bort;.  p->nChan
e880: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
e890: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
e8a0: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
e8b0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
e8c0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
e8d0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
e8e0: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
e8f0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72  BE_PROFILE.  for
e900: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
e910: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  i++){.    p->aOp
e920: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
e930: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
e940: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  s = 0;.  }.#endi
e950: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
e960: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
e970: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
e980: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  on for the first
e990: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63   time after.** c
e9a0: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74  reating the virt
e9b0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68  ual machine.  Th
e9c0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
e9d0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
e9e0: 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65  locating registe
e9f0: 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  rs and initializ
ea00: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
ea10: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
ea20: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
ea30: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
ea40: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
ea50: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
ea60: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
ea70: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
ea80: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ea90: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
eaa0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20  exactly once on 
eab0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63  each virtual mac
eac0: 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74  hine..** After t
ead0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
eae0: 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73  alled the VM has
eaf0: 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22   been "packaged"
eb00: 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a   and is ready.**
eb10: 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20   to run.  After 
eb20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
eb30: 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20  called, further 
eb40: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
eb50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
eb60: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
eb70: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
eb80: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
eb90: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
eba0: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
ebb0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
ebc0: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
ebd0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
ebe0: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
ebf0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
ec00: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
ec10: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
ec20: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
ec30: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
ec40: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
ec50: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
ec60: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
ec70: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
ec80: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
ec90: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
eca0: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
ecb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
ecc0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
ecd0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ece0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ecf0: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
ed00: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
ed10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
ed20: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
ed30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
ed40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ed50: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
ed60: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
ed70: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
eda0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
edb0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
edd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
ede0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
edf0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
ee00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ee10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ee20: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
ee30: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ee60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
ee70: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
ee80: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
eeb0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73  */.  struct Reus
eec0: 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20  ableSpace x;    
eed0: 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20      /* Reusable 
eee0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a  bulk memory */..
eef0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
ef00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
ef10: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
ef20: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
ef30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
ef40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
ef50: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
ef60: 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73  pParse==p->pPars
ef70: 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e );.  db = p->d
ef80: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  b;.  assert( db-
ef90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
efa0: 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61   );.  nVar = pPa
efb0: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65  rse->nVar;.  nMe
efc0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
efd0: 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50  ;.  nCursor = pP
efe0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41  arse->nTab;.  nA
eff0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61  rg = pParse->nMa
f000: 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61  xArg;.  .  /* Ea
f010: 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61  ch cursor uses a
f020: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54   memory cell.  T
f030: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
f040: 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20  (cursor 0) can. 
f050: 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20   ** use aMem[0] 
f060: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68  which is not oth
f070: 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74  erwise used by t
f080: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
f090: 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20    Allocate.  ** 
f0a0: 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
f0b0: 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63   of aMem[] for c
f0c0: 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65  ursors 1 and gre
f0d0: 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61  ater..  ** See a
f0e0: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
f0f0: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
f100: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  em += nCursor;. 
f110: 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20   if( nCursor==0 
f120: 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d  && nMem>0 ) nMem
f130: 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f  ++;  /* Space fo
f140: 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69  r aMem[0] even i
f150: 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20  f not used */.. 
f160: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
f170: 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65  ow much reusable
f180: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
f190: 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20  able at the end 
f1a0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f  of the.  ** opco
f1b0: 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20  de array.  This 
f1c0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c  extra memory wil
f1d0: 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  l be reallocated
f1e0: 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65   for other eleme
f1f0: 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  nts.  ** of the 
f200: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
f210: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52  nt..  */.  n = R
f220: 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29  OUND8(sizeof(Op)
f230: 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20  *p->nOp);       
f240: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
f250: 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  of opcode memory
f260: 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70   used */.  x.pSp
f270: 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e  ace = &((u8*)p->
f280: 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20  aOp)[n];        
f290: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
f2a0: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a   opcode memory *
f2b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  /.  assert( EIGH
f2c0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
f2d0: 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20  (x.pSpace) );.  
f2e0: 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44  x.nFree = ROUNDD
f2f0: 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f  OWN8(pParse->szO
f300: 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a  pAlloc - n);  /*
f310: 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   Bytes of unused
f320: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73   memory */.  ass
f330: 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20  ert( x.nFree>=0 
f340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
f350: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
f360: 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46  T(&x.pSpace[x.nF
f370: 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f  ree]) );..  reso
f380: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
f390: 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73  nArg);.  p->uses
f3a0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  StmtJournal = (u
f3b0: 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  8)(pParse->isMul
f3c0: 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73  tiWrite && pPars
f3d0: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20  e->mayAbort);.  
f3e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
f3f0: 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29  ain && nMem<10 )
f400: 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b  {.    nMem = 10;
f410: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65  .  }.  p->expire
f420: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
f430: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
f440: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
f450: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
f460: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20  llocated in one 
f470: 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73  or two.  ** pass
f480: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
f490: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
f4a0: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d  o reuse unused m
f4b0: 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20  emory at the .  
f4c0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
f4d0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
f4e0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
f4f0: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
f500: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
f510: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
f520: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
f530: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
f540: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
f550: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
f560: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69  he remainder usi
f570: 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72  ng a fresh memor
f580: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  y allocation.  .
f590: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
f5a0: 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
f5b0: 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
f5c0: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
f5d0: 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
f5e0: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d  * the leftover m
f5f0: 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64  emory at the end
f600: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
f610: 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20  rray.  This can 
f620: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
f630: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
f640: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
f650: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
f660: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
f670: 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e  /.  do {.    x.n
f680: 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20  Needed = 0;.    
f690: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
f6a0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d  pace(&x, p->aMem
f6b0: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
f6c0: 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72  m));.    p->aVar
f6d0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
f6e0: 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  , p->aVar, nVar*
f6f0: 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
f700: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
f710: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
f720: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
f730: 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d  f(Mem*));.    p-
f740: 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70  >apCsr = allocSp
f750: 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72  ace(&x, p->apCsr
f760: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
f770: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a  (VdbeCursor*));.
f780: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f790: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
f7a0: 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78  ATUS.    p->anEx
f7b0: 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ec = allocSpace(
f7c0: 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70  &x, p->anExec, p
f7d0: 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
f7e0: 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  ));.#endif.    i
f7f0: 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20  f( x.nNeeded==0 
f800: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70  ) break;.    x.p
f810: 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65  Space = p->pFree
f820: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
f830: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e  ocRawNN(db, x.nN
f840: 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46  eeded);.    x.nF
f850: 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b  ree = x.nNeeded;
f860: 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e  .  }while( !db->
f870: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
f880: 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70  .  p->pVList = p
f890: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20  Parse->pVList;. 
f8a0: 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
f8b0: 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
f8c0: 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
f8d0: 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  lain;.  if( db->
f8e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f8f0: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b      p->nVar = 0;
f900: 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
f910: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  = 0;.    p->nMem
f920: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
f930: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
f940: 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e  nCursor;.    p->
f950: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
f960: 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  ar;.    initMemA
f970: 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56  rray(p->aVar, nV
f980: 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  ar, db, MEM_Null
f990: 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  );.    p->nMem =
f9a0: 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d   nMem;.    initM
f9b0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
f9c0: 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55   nMem, db, MEM_U
f9d0: 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d  ndefined);.    m
f9e0: 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20  emset(p->apCsr, 
f9f0: 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
fa00: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
fa10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fa20: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
fa30: 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74  TATUS.    memset
fa40: 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70  (p->anExec, 0, p
fa50: 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
fa60: 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ));.#endif.  }. 
fa70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
fa80: 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
fa90: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
faa0: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
fab0: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
fac0: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
fad0: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
fae0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
faf0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
fb00: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
fb10: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
fb20: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
fb30: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
fb40: 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d  sert( pCx->pBtx=
fb50: 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54  =0 || pCx->eCurT
fb60: 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
fb70: 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  EE );.  switch( 
fb80: 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b  pCx->eCurType ){
fb90: 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
fba0: 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20  E_SORTER: {.    
fbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
fbc0: 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
fbd0: 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pCx);.      brea
fbe0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
fbf0: 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a  e CURTYPE_BTREE:
fc00: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78   {.      if( pCx
fc10: 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  ->isEphemeral ){
fc20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78  .        if( pCx
fc30: 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33  ->pBtx ) sqlite3
fc40: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
fc50: 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  pBtx);.        /
fc60: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
fc70: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
fc80: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
fc90: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
fca0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
fcb0: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
fcc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fcd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d      assert( pCx-
fce0: 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
fcf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fd00: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
fd10: 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  r(pCx->uc.pCurso
fd20: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
fd30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
fd40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fd50: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
fd60: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
fd70: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
fd80: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
fd90: 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d  or *pVCur = pCx-
fda0: 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20  >uc.pVCur;.     
fdb0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
fdc0: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
fdd0: 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70   pVCur->pVtab->p
fde0: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73  Module;.      as
fdf0: 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74  sert( pVCur->pVt
fe00: 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ab->nRef>0 );.  
fe10: 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62      pVCur->pVtab
fe20: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
fe30: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
fe40: 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72  pVCur);.      br
fe50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
fe60: 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  f.  }.}../*.** C
fe70: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
fe80: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
fe90: 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  frame..*/.static
fea0: 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f   void closeCurso
feb0: 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a  rsInFrame(Vdbe *
fec0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
fed0: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
fee0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fef0: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
ff00: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
ff10: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
ff20: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
ff30: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
ff40: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
ff50: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
ff60: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
ff70: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
ff80: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
ff90: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
ffa0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
ffb0: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
ffc0: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
ffd0: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
ffe0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
fff0: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
10000 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
10010 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
10020 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
10030 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
10040 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
10050 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
10060 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
10070 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
10080 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75  me->v;.  closeCu
10090 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b  rsorsInFrame(v);
100a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
100b0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
100c0 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65  TATUS.  v->anExe
100d0 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78  c = pFrame->anEx
100e0 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e  ec;.#endif.  v->
100f0 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
10100 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
10110 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
10120 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
10130 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
10140 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
10150 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
10160 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
10170 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
10180 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
10190 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
101a0 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
101b0 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
101c0 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
101d0 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
101e0 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
101f0 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74  bChange;.  sqlit
10200 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
10210 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70  ata(v->db, &v->p
10220 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
10230 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  v->pAuxData =
10240 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
10250 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  a;.  pFrame->pAu
10260 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74  xData = 0;.  ret
10270 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
10280 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10290 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
102a0 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
102b0 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
102c0 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
102d0 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
102e0 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
102f0 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
10300 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
10310 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
10320 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
10330 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
10340 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
10350 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
10360 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
10370 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
10380 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
10390 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
103a0 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
103b0 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
103c0 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
103d0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
103e0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
103f0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
10400 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
10410 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
10420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
10430 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
10440 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
10450 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
10460 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
10470 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
10480 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
10490 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
104a0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
104b0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
104c0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
104d0 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
104e0 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
104f0 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
10500 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
10510 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
10520 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
10530 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
10540 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
10550 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
10560 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
10570 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
10580 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
10590 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
105a0 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
105b0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
105c0 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26  AuxData(p->db, &
105d0 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
105e0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
105f0 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
10600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
10610 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
10620 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
10630 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
10640 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
10650 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
10660 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
10670 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
10680 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
10690 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
106a0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
106b0 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
106c0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
106d0 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
106e0 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
106f0 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
10700 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
10710 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
10720 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
10730 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
10740 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
10750 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
10760 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65  b;..  if( p->nRe
10770 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72  sColumn ){.    r
10780 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
10790 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
107a0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
107b0 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E_N);.    sqlite
107c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
107d0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ColName);.  }.  
107e0 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
107f0 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
10800 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
10810 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
10820 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  ->aColName = (Me
10830 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
10840 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
10850 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
10860 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
10870 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e  0 ) return;.  in
10880 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  itMemArray(p->aC
10890 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d  olName, n, db, M
108a0 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  EM_Null);.}../*.
108b0 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
108c0 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
108d0 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
108e0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
108f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
10900 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
10910 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
10920 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
10930 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
10940 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
10950 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
10960 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
10970 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
10980 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
10990 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
109a0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
109b0 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
109c0 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
109d0 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
109e0 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
109f0 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
10a00 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
10a10 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
10a20 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
10a30 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
10a40 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
10a50 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
10a60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
10a70 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
10a80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
10a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
10aa0 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
10ab0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
10ac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10ae0 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
10af0 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
10b00 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
10b30 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
10b40 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
10b50 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
10b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10b70 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
10b80 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
10b90 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
10ba0 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
10bb0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
10bc0 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
10bd0 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
10be0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
10bf0 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
10c00 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
10c10 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
10c20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
10c30 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
10c40 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
10c50 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
10c60 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
10c70 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
10c80 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
10c90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
10ca0 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
10cb0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
10cc0 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
10cd0 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
10ce0 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
10cf0 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
10d00 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
10d10 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
10d20 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
10d30 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
10d40 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
10d50 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
10d60 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
10d70 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
10d80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10d90 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
10da0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
10db0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
10dc0 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
10dd0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
10de0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
10df0 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
10e00 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
10e10 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
10e20 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
10e30 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
10e40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
10e50 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
10e60 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
10e70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10e80 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
10e90 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
10ea0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
10eb0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
10ec0 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
10ed0 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
10ee0 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
10ef0 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
10f00 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e-transaction.  
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e   ** that are can
10f30 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77  didates for a tw
10f40 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75  o-phase commit u
10f50 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20  sing a.         
10f60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73            ** mas
10f70 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter-journal */. 
10f80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10f90 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
10fa0 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
10fb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10fc0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
10fd0 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
10fe0 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
10ff0 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
11000 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
11010 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
11020 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
11030 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
11040 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
11050 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
11060 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
11070 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
11080 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
11090 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
110a0 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
110b0 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
110c0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
110d0 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
110e0 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
110f0 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
11100 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
11110 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
11120 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
11130 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
11140 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
11150 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
11160 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
11170 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
11180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
11190 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
111a0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
111b0 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
111c0 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
111d0 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
111e0 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
111f0 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
11200 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
11210 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
11220 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
11230 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
11240 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
11250 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
11260 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
11270 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
11280 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
11290 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
112a0 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
112b0 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
112c0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
112d0 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
112e0 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
112f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
11300 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
11310 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
11320 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11330 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
11340 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
11350 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
11360 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
11370 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62  r or not a datab
11380 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61  ase might need a
11390 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
113a0 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20  depends upon.   
113b0 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61     ** its journa
113c0 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74  l mode (among ot
113d0 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68  her things).  Th
113e0 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d  is matrix determ
113f0 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ines which.     
11400 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65   ** journal mode
11410 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a  s use a master j
11420 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68  ournal and which
11430 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20   do not */.     
11440 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
11450 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b   aMJNeeded[] = {
11460 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45  .        /* DELE
11470 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20  TE   */  1,.    
11480 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20      /* PERSIST  
11490 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
114a0 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30  * OFF       */ 0
114b0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  ,.        /* TRU
114c0 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20  NCATE  */ 1,.   
114d0 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20       /* MEMORY  
114e0 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
114f0 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20  /* WAL       */ 
11500 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
11510 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
11520 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63    /* Pager assoc
11530 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a  iated with pBt *
11540 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  /.      needXcom
11550 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  mit = 1;.      s
11560 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11570 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61  (pBt);.      pPa
11580 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
11590 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
115a0 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
115b0 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  i].safety_level!
115c0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
115d0 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26  US_OFF.       &&
115e0 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74   aMJNeeded[sqlit
115f0 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
11600 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20  lMode(pPager)]. 
11610 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
11620 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50 61  PagerIsMemdb(pPa
11630 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ger)==0.      ){
11640 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
11650 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i!=1 );.      
11660 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20    nTrans++;.    
11670 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
11680 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
11690 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
116a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
116b0 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
116c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
116d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
116e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
116f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
11700 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
11710 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
11720 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
11730 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
11740 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
11750 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
11760 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
11770 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
11780 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
11790 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
117a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
117b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
117c0 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
117d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
117e0 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
117f0 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
11800 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
11810 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
11820 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
11830 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
11840 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
11850 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
11860 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
11870 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
11880 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
11890 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
118a0 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
118b0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
118c0 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
118d0 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
118e0 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
118f0 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
11900 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
11910 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
11920 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
11930 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
11940 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
11950 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
11960 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
11970 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
11980 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
11990 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
119a0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
119b0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
119c0 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
119d0 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
119e0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
119f0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
11a00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
11a10 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11a20 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11a30 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
11a40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
11a50 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11a60 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
11a70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
11a80 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
11a90 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
11aa0 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
11ab0 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
11ac0 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
11ad0 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
11ae0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
11af0 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
11b00 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
11b10 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
11b20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
11b30 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
11b40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
11b50 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
11b60 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
11b70 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
11b80 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
11b90 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
11ba0 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
11bb0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11bd0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11be0 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
11bf0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
11c00 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
11c10 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
11c20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
11c30 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
11c40 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
11c50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
11c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11c70 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
11c80 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
11c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
11ca0 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
11cb0 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
11cc0 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
11cd0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
11ce0 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
11cf0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11d00 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
11d10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11d20 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
11d30 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
11d40 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
11d50 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
11d60 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
11d70 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
11d80 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61  b->pVfs;.    cha
11d90 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
11da0 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
11db0 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
11dc0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
11dd0 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
11de0 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
11df0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
11e00 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
11e10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
11e20 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
11e30 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
11e40 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
11e50 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
11e60 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
11e70 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
11e80 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
11e90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
11ea0 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
11eb0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
11ec0 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
11ed0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
11ee0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
11ef0 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
11f00 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
11f10 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
11f20 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
11f30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
11f40 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11f50 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
11f60 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
11f70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
11f80 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
11f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11fa0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
11fb0 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
11fc0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
11fd0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11fe0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
11ff0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
12000 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12010 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12020 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
12030 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12040 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
12050 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
12060 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
12070 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12080 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
12090 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
120a0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
120b0 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
120c0 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
120d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
120e0 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
120f0 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
12100 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
12130 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
12140 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
12150 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
12160 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
12170 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
12180 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
12190 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
121a0 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
121b0 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
121c0 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
121d0 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
121e0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
121f0 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
12200 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
12210 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
12220 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
12230 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
12240 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
12250 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
12260 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
12270 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
12280 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
12290 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
122a0 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
122b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
122c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
122d0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
122e0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
122f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12300 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
12310 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
12320 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
12330 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
12340 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
12350 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
12360 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
12370 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
12380 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
12390 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
123a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
123b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
123c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
123d0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
123e0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
123f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
12400 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
12410 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
12420 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
12430 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
12440 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
12450 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12460 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
12470 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
12480 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
12490 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
124a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
124b0 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
124c0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
124d0 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
124e0 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
124f0 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
12500 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
12510 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
12520 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
12530 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
12540 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
12550 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
12560 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
12570 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
12580 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12590 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
125a0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
125b0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
125c0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
125d0 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
125e0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
125f0 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
12600 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
12610 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12620 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
12630 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
12640 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
12650 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
12660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
12670 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
12680 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12690 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
126a0 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
126b0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
126c0 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
126d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
126e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
126f0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
12700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
12720 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
12730 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
12740 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
12750 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
12760 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
12770 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12780 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
12790 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
127a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
127b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
127c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
127d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
127e0 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
127f0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
12800 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
12810 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
12820 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
12830 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c  .    if( 0==(sql
12840 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
12850 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
12860 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
12870 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
12880 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
12890 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
128a0 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
128b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
128c0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
128d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
128e0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
128f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
12900 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
12910 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
12920 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
12930 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
12940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
12950 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
12960 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
12970 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
12980 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
12990 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
129a0 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
129b0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
129c0 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
129d0 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
129e0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
129f0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
12a00 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
12a10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12a20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12a30 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
12a40 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
12a50 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
12a60 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
12a70 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
12a80 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
12a90 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
12aa0 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
12ab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
12ac0 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
12ad0 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
12ae0 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
12af0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
12b00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
12b10 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
12b20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
12b30 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
12b40 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
12b50 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
12b60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
12b70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
12b80 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
12b90 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
12ba0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
12bb0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
12bc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
12bd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
12be0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
12bf0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12c00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
12c10 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
12c20 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
12c30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
12c40 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
12c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12c60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12c70 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
12c80 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
12c90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
12ca0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
12cb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12cc0 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
12cd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12ce0 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
12cf0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
12d00 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
12d10 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
12d20 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
12d30 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
12d40 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
12d50 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
12d60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
12d70 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
12d80 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
12d90 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
12da0 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
12db0 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
12dc0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
12dd0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
12de0 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
12df0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
12e00 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
12e10 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
12e20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
12e30 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
12e40 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
12e50 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
12e60 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
12e70 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
12e80 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
12e90 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
12ea0 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
12eb0 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
12ec0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
12ed0 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
12ee0 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
12ef0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
12f00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
12f10 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
12f20 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
12f30 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
12f40 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
12f50 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
12f60 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
12f70 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
12f80 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
12f90 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
12fa0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
12fb0 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
12fc0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
12fd0 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
12fe0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
12ff0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
13000 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13010 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
13020 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
13030 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
13040 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
13050 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
13060 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
13070 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
13080 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
13090 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
130a0 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
130b0 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
130c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
130d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
130e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
130f0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
13100 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
13110 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
13120 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
13130 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
13140 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
13150 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
13160 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
13170 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
13180 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
13190 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
131a0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
131b0 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
131c0 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
131d0 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
131e0 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
131f0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
13200 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
13210 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
13220 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
13230 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13240 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
13250 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
13260 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
13270 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
13280 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
13290 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
132a0 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
132b0 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
132c0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
132d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
132e0 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
132f0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
13300 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
13310 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
13320 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
13330 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
13340 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
13350 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
13360 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
13370 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
13380 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
13390 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
133a0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
133b0 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
133c0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
133d0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
133e0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
133f0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
13400 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
13410 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
13420 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
13430 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
13440 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
13450 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
13460 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
13470 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
13480 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
13490 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
134a0 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
134b0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
134c0 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
134d0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
134e0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
134f0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
13500 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
13510 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
13520 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
13530 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
13540 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
13550 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
13560 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
13570 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
13580 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
13590 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
135a0 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  _OK..*/.static S
135b0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
135c0 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  nt vdbeCloseStat
135d0 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
135e0 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
135f0 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
13600 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
13610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
13620 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  t i;.  const int
13630 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
13640 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
13650 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
13660 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13670 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
13680 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
13690 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
136a0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
136b0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
136c0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
136d0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
136e0 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69  int) );..  for(i
136f0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
13700 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63  ++){ .    int rc
13710 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
13720 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
13730 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
13740 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
13750 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
13760 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13770 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20   ){.        rc2 
13780 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
13790 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
137a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
137b0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
137c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
137d0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
137e0 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  {.        rc2 = 
137f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
13800 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
13810 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
13820 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
13830 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
13840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13850 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
13860 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13870 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  }.  db->nStateme
13880 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74  nt--;.  p->iStat
13890 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ement = 0;..  if
138a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
138b0 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  ){.    if( eOp==
138c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
138d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
138e0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
138f0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
13900 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
13910 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
13920 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13940 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
13950 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
13960 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
13970 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
13980 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
13990 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
139a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
139b0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
139c0 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
139d0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
139e0 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
139f0 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
13a00 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
13a10 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
13a20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
13a30 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
13a40 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
13a50 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
13a60 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
13a70 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13a80 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
13a90 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  efCons;.    db->
13aa0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
13ab0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
13ac0 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74  mCons;.  }.  ret
13ad0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
13ae0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
13af0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
13b00 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28   int eOp){.  if(
13b10 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65   p->db->nStateme
13b20 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
13b30 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ent ){.    retur
13b40 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  n vdbeCloseState
13b50 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20  ment(p, eOp);.  
13b60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13b70 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
13b80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13b90 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
13ba0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
13bb0 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
13bc0 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
13bd0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
13be0 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
13bf0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
13c00 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
13c10 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
13c20 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
13c30 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
13c40 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
13c50 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
13c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13c70 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
13c80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
13c90 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
13ca0 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
13cb0 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
13cc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
13cd0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
13ce0 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
13cf0 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
13d00 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
13d10 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
13d20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
13d30 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
13d40 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
13d50 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
13d60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13d70 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
13d80 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
13d90 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
13da0 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
13db0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
13dc0 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
13dd0 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
13de0 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
13df0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
13e00 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
13e10 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
13e20 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
13e30 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
13e40 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13e50 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
13e60 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
13e70 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
13e80 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
13e90 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
13ea0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
13eb0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
13ec0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13ed0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13ee0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
13ef0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13f00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
13f10 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
13f20 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
13f30 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
13f40 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
13f50 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
13f60 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
13f70 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
13f80 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
13f90 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
13fa0 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
13fb0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
13fc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
13fd0 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
13fe0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
13ff0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
14000 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
14010 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
14020 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
14030 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
14040 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
14050 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
14060 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
14070 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
14080 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
14090 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
140a0 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
140b0 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
140c0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
140d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
140e0 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
140f0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
14100 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
14110 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
14120 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
14130 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
14140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14150 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
14160 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
14190 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
141a0 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
141b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
141c0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
141d0 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
141e0 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
141f0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
14200 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
14210 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
14220 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
14230 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
14240 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
14250 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
14260 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
14270 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
14280 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
14290 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
142a0 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
142b0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
142c0 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
142d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
142e0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
142f0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
14300 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
14310 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
14320 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
14330 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
14340 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
14350 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
14360 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
14370 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
14380 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
14390 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
143a0 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
143b0 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
143c0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
143d0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
143e0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
143f0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
14400 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
14410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14420 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
14430 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14440 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
14450 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14460 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  KPT;.  }.  close
14470 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
14480 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
14490 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
144a0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
144b0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
144c0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
144d0 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
144e0 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
144f0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
14500 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
14510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
14520 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
14530 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
14540 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
14550 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
14560 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
14570 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
14580 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
14590 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
145a0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
145b0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
145c0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
145d0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
145e0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
145f0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
14600 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
14610 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
14620 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
14630 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
14640 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
14650 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
14660 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
14670 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
14680 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
14690 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
146a0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
146c0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
146d0 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
146e0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
146f0 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
14700 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
14710 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
14720 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
14730 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
14740 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
14750 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
14760 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
14770 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
14780 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
14790 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
147a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
147b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
147c0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
147d0 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
147e0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
147f0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
14800 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
14810 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
14820 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
14830 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
14840 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
14850 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
14860 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
14870 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
14880 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
14890 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
148a0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
148b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
148c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
148d0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
148e0 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
148f0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
14900 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
14910 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
14920 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
14930 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
14940 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
14950 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
14960 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
14970 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
14980 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
14990 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
149a0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
149b0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
149c0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
149d0 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
149e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
149f0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
14a00 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
14a10 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
14a20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
14a30 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
14a40 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
14a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14a60 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
14a70 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
14a80 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
14a90 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
14aa0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
14ab0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
14ac0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
14ad0 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
14ae0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
14af0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
14b00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14b10 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14b20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14b30 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14b40 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
14b50 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
14b60 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
14b70 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
14b80 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
14ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14bb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
14bc0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
14bd0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
14be0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
14bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14c10 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
14c20 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
14c30 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
14c40 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
14c50 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
14c60 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
14c70 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
14c80 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
14c90 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
14ca0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
14cb0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
14cc0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
14cd0 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
14ce0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
14cf0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
14d00 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
14d10 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
14d20 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
14d30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
14d40 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
14d50 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
14d60 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
14d70 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
14d80 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
14d90 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
14da0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14db0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
14dc0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
14dd0 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
14de0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
14df0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14e00 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
14e10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14e30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
14e40 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
14e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14e60 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
14e70 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
14e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14e90 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
14ea0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
14eb0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
14ec0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
14ed0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
14ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14ef0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
14f00 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
14f10 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
14f20 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
14f30 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
14f40 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
14f50 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
14f60 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
14f70 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
14f80 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
14f90 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
14fa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14fb0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
14fc0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
14fd0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
14fe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
14ff0 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
15000 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
15010 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15020 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
15030 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
15040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15050 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
15060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15070 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
15080 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
15090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
150a0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
150b0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
150c0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
150d0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
150e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
150f0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
15100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15110 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
15120 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
15130 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
15140 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
15150 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
15160 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
15170 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
15180 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
15190 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
151a0 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
151b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
151c0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
151d0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
151e0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  _OK);.        p-
151f0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
15200 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
15210 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
15220 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
15230 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
15240 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
15250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
15260 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
15270 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
15280 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
15290 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
152a0 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
152b0 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
152c0 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
152d0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
152e0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
152f0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
15300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15310 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
15320 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
15330 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
15340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
15350 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
15360 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
15370 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
15380 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
15390 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
153a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
153b0 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
153c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
153d0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
153e0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
153f0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
15400 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
15410 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
15420 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
15430 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
15440 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
15450 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
15460 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
15470 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
15480 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
15490 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
154a0 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
154b0 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
154c0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
154d0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
154e0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
154f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15500 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
15510 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15520 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
15530 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
15540 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
15550 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
15560 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15570 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
15580 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
15590 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
155a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
155b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
155c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
155d0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
155e0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
155f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
15600 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
15610 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
15620 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
15630 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
15640 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15650 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15660 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15670 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
15680 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
15690 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
156a0 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
156b0 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
156c0 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
156d0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
156e0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
156f0 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
15700 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
15710 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
15720 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
15730 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
15740 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
15750 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
15760 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
15770 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
15790 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
157a0 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
157b0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
157c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
157d0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
157e0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
157f0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
15800 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
15810 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
15820 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
15830 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
15840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
15850 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
15860 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
15870 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
15880 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
15890 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
158a0 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
158b0 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
158c0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
158d0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
158e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
158f0 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
15900 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
15910 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
15920 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
15930 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
15940 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
15950 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
15960 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
15970 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
15980 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
15990 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
159a0 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
159b0 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
159c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
159d0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
159e0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
159f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
15a00 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
15a10 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
15a20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
15a30 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
15a40 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
15a50 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
15a60 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
15a70 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
15a80 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
15a90 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
15aa0 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
15ab0 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
15ac0 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
15ad0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
15ae0 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
15af0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
15b00 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
15b10 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
15b20 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
15b30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
15b40 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
15b50 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
15b60 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
15b70 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
15b80 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
15b90 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
15ba0 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
15bb0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
15bc0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
15bd0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
15be0 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
15bf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
15c00 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
15c10 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
15c20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15c30 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
15c40 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
15c50 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15c60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
15c70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
15c80 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
15c90 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
15ca0 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
15cb0 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
15cc0 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
15cd0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
15ce0 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
15cf0 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
15d00 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
15d10 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
15d20 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
15d30 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
15d40 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
15d50 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
15d60 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
15d70 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
15d80 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
15d90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
15da0 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
15db0 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
15dc0 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
15dd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15de0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
15df0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
15e00 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
15e10 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
15e20 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  loc++;.    sqlit
15e30 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
15e40 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
15e50 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
15e60 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
15e70 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
15e80 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
15e90 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
15ea0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
15eb0 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
15ec0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
15ed0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
15ee0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
15ef0 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f  db->bBenignMallo
15f00 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c--;.  }else if(
15f10 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20   db->pErr ){.   
15f20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
15f30 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Null(db->pErr);.
15f40 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64    }.  db->errCod
15f50 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  e = rc;.  return
15f60 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
15f70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
15f80 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  LOG./*.** If an 
15f90 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
15fa0 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67  LLOG hook is reg
15fb0 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20  istered and the 
15fc0 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c  VM has been run,
15fd0 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a   .** invoke it..
15fe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
15ff0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
16000 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
16010 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16020 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76  fig.xSqllog && v
16030 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16040 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d  && v->zSql && v-
16050 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68  >pc>=0 ){.    ch
16060 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20  ar *zExpanded = 
16070 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e  sqlite3VdbeExpan
16080 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29  dSql(v, v->zSql)
16090 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d  ;.    assert( v-
160a0 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d  >db->init.busy==
160b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78  0 );.    if( zEx
160c0 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20  panded ){.      
160d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
160e0 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20  fig.xSqllog(.   
160f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
16100 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
16110 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45  ogArg, v->db, zE
16120 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20  xpanded, 1.     
16130 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16140 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a  3DbFree(v->db, z
16150 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d  Expanded);.    }
16160 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
16170 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65  efine vdbeInvoke
16180 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66  Sqllog(x).#endif
16190 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
161a0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
161b0 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
161c0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
161d0 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
161e0 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
161f0 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
16200 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
16210 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
16220 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
16230 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
16240 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
16250 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
16260 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
16270 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
16280 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
16290 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
162a0 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
162b0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
162c0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
162d0 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
162e0 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
162f0 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
16300 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
16310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16320 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
16330 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
16340 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
16350 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
16360 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
16370 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
16380 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
16390 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
163a0 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
163b0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
163c0 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
163d0 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
163e0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
163f0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
16400 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
16410 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
16420 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
16430 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
16440 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
16450 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
16460 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
16470 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
16480 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
16490 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
164a0 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
164b0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
164c0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
164d0 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
164e0 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
164f0 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
16500 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
16510 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
16520 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
16530 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
16540 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
16550 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
16560 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
16570 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
16580 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
16590 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
165a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
165b0 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
165c0 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
165d0 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
165e0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
165f0 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
16600 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
16610 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
16620 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
16630 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
16640 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
16650 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
16660 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
16670 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
16680 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
16690 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
166a0 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
166b0 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
166c0 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
166d0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
166e0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
166f0 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d   p->rc, p->zErrM
16700 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70  sg ? "%s" : 0, p
16710 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  ->zErrMsg);.  }.
16720 0a 20 20 2f 2a 20 52 65 73 65 74 20 72 65 67 69  .  /* Reset regi
16730 73 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61 6e  ster contents an
16740 64 20 72 65 63 6c 61 69 6d 20 65 72 72 6f 72 20  d reclaim error 
16750 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 2e 0a  message memory..
16760 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
16770 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
16780 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
16790 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
167a0 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
167b0 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
167c0 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
167d0 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
167e0 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
167f0 20 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70   up.  */.  if( p
16800 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d  ->apCsr ) for(i=
16810 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
16820 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
16830 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
16840 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
16850 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16860 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
16870 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
16880 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65  .flags==MEM_Unde
16890 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e  fined );.  }.#en
168a0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
168b0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
168c0 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
168d0 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
168e0 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 2f  ultSet = 0;..  /
168f0 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
16900 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
16910 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
16920 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
16930 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
16940 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
16950 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
16960 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
16970 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
16980 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
16990 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
169a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
169b0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
169c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
169d0 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
169e0 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
169f0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
16a00 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
16a10 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
16a20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20          char c, 
16a30 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
16a40 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
16a50 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   ");.        for
16a60 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53  (i=0; (c = p->zS
16a70 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  ql[i])!=0; i++){
16a80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16a90 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c=='\n' ) fprint
16aa0 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
16ab0 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c           putc(c,
16ac0 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20   out);.         
16ad0 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20   pc = c;.       
16ae0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
16af0 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c!='\n' ) fprint
16b00 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
16b10 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
16b20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
16b30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
16b40 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20  r zHdr[100];.   
16b50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
16b60 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64  rintf(sizeof(zHd
16b70 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25  r), zHdr, "%6u %
16b80 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20  12llu %8llu ",. 
16b90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
16ba0 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
16bb0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
16bc0 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
16bd0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
16be0 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
16bf0 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
16c00 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
16c10 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
16c20 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72  (out, "%s", zHdr
16c30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16c40 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
16c50 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
16c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16c70 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
16c80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
16c90 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16ca0 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20  _MAGIC_RESET;.  
16cb0 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
16cc0 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
16cd0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
16ce0 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
16cf0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
16d00 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
16d10 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
16d20 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
16d30 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
16d40 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
16d50 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
16d60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16d70 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
16d80 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
16d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
16da0 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
16db0 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
16dc0 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
16dd0 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
16de0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
16df0 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
16e00 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
16e10 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
16e20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
16e30 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
16e40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16e50 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
16e60 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
16e70 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
16e80 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
16e90 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
16ea0 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
16eb0 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
16ec0 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
16ed0 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
16ee0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
16ef0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
16f00 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
16f10 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
16f20 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
16f30 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
16f40 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
16f50 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
16f60 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
16f70 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
16f80 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
16f90 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
16fa0 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
16fb0 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
16fc0 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
16fd0 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
16fe0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
16ff0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
17000 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
17010 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
17020 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
17030 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
17040 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
17050 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
17060 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
17070 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
17080 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
17090 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
170a0 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
170b0 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
170c0 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
170d0 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
170e0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
170f0 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64  xData(sqlite3 *d
17100 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c  b, AuxData **pp,
17110 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
17120 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70  sk){.  while( *p
17130 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61  p ){.    AuxData
17140 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20   *pAux = *pp;.  
17150 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20    if( (iOp<0).  
17160 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75     || (pAux->iAu
17170 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20  xOp==iOp.       
17180 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75 78     && pAux->iAux
17190 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  Arg>=0.         
171a0 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78 41   && (pAux->iAuxA
171b0 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20  rg>31 || !(mask 
171c0 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78  & MASKBIT32(pAux
171d0 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20 20  ->iAuxArg)))).  
171e0 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
171f0 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78 41  ase( pAux->iAuxA
17200 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
17210 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
17220 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20  eAux ){.        
17230 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78  pAux->xDeleteAux
17240 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
17250 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
17260 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78  = pAux->pNextAux
17270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
17280 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b  bFree(db, pAux);
17290 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
172a0 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65    pp= &pAux->pNe
172b0 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  xtAux;.    }.  }
172c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
172d0 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
172e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
172f0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
17300 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17310 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
17320 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
17330 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
17340 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
17350 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
17360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
17370 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
17380 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
17390 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
173a0 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
173b0 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
173c0 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
173d0 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
173e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
173f0 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
17400 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
17410 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17420 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
17430 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
17440 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
17450 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
17460 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  t;.  assert( p->
17470 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
17480 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
17490 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
174a0 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
174b0 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
174c0 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72   for(pSub=p->pPr
174d0 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75  ogram; pSub; pSu
174e0 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  b=pNext){.    pN
174f0 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78  ext = pSub->pNex
17500 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f  t;.    vdbeFreeO
17510 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d  pArray(db, pSub-
17520 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29  >aOp, pSub->nOp)
17530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
17540 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ree(db, pSub);. 
17550 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69   }.  if( p->magi
17560 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c!=VDBE_MAGIC_IN
17570 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  IT ){.    releas
17580 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
17590 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  r, p->nVar);.   
175a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
175b0 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20  b, p->pVList);. 
175c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
175d0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
175e0 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70    }.  vdbeFreeOp
175f0 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
17600 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
17610 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
17620 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
17630 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17640 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65   p->zSql);.#ifde
17650 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17660 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
17670 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
17680 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
17690 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20  >nScan; i++){.  
176a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
176b0 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69  e(db, p->aScan[i
176c0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
176d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
176e0 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b  e(db, p->aScan);
176f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
17700 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
17710 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
17720 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
17730 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
17740 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
17750 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
17760 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
17770 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17780 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
17790 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
177a0 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
177b0 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66  ect(db, p);.  if
177c0 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
177d0 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
177e0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
177f0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
17800 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
17810 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
17820 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
17830 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
17840 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
17850 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
17860 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
17870 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
17880 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
17890 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
178a0 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  eNN(db, p);.}../
178b0 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
178c0 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e  "p" has a pendin
178d0 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  g seek operation
178e0 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
178f0 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65  t been.** carrie
17900 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65  d out.  Seek the
17910 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66   cursor now.  If
17920 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
17930 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
17940 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
17950 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
17960 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
17970 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65  NLINE handleDefe
17980 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43  rredMoveto(VdbeC
17990 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
179a0 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
179b0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
179c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
179d0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
179e0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
179f0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
17a00 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  to );.  assert( 
17a10 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
17a20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
17a30 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
17a40 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  EE );.  rc = sql
17a50 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
17a60 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43  npacked(p->uc.pC
17a70 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
17a80 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
17a90 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
17aa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
17ab0 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
17ac0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17ad0 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
17ae0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
17af0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
17b00 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
17b10 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
17b20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
17b30 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
17b40 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
17b50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17b60 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
17b70 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
17b80 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
17b90 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
17ba0 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
17bb0 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
17bc0 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
17bd0 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
17be0 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
17bf0 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
17c00 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
17c10 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
17c20 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
17c30 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
17c40 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
17c50 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
17c60 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
17c70 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
17c80 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
17c90 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
17ca0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
17cb0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
17cc0 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
17cd0 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
17ce0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
17cf0 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
17d00 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
17d10 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
17d20 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
17d30 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75  ssert( p->uc.pCu
17d40 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
17d50 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
17d60 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
17d70 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
17d80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17d90 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
17da0 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  re(p->uc.pCursor
17db0 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
17dc0 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
17dd0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
17de0 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
17df0 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
17e00 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
17e10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17e20 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
17e30 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
17e40 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
17e50 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
17e60 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
17e70 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
17e80 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
17e90 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
17ea0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17eb0 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
17ec0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
17ed0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
17ee0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
17ef0 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71  TREE );.  if( sq
17f00 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17f10 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
17f20 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
17f30 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
17f40 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
17f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
17f70 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
17f80 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
17f90 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
17fa0 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
17fb0 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
17fc0 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
17fd0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
17fe0 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
17ff0 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
18000 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
18010 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
18020 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
18030 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
18040 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
18050 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
18060 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
18070 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
18080 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
18090 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
180a0 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
180b0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
180c0 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
180d0 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
180e0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
180f0 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
18100 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
18110 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
18120 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
18130 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
18140 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
18150 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
18160 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
18170 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
18180 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
18190 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
181a0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
181b0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
181c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
181d0 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
181e0 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e  eCursor **pp, in
181f0 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62  t *piCol){.  Vdb
18200 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70  eCursor *p = *pp
18210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
18220 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
18230 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43 75  _BTREE || p->eCu
18240 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50  rType==CURTYPE_P
18250 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20 70  SEUDO );.  if( p
18260 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
18270 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61 70   ){.    int iMap
18280 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c  ;.    if( p->aAl
18290 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20  tMap && (iMap = 
182a0 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69  p->aAltMap[1+*pi
182b0 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20  Col])>0 ){.     
182c0 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75   *pp = p->pAltCu
182d0 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69 43  rsor;.      *piC
182e0 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20  ol = iMap - 1;. 
182f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18300 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
18310 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
18320 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
18330 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
18340 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
18350 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
18360 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  sor) ){.    retu
18370 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  rn handleMovedCu
18380 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72  rsor(p);.  }.  r
18390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
183a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
183b0 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
183c0 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
183d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
183e0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
183f0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
18400 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
18410 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
18420 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
18430 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
18440 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
18450 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
18460 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
18470 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
18480 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
18490 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
184a0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
184b0 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
184c0 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
184d0 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
184e0 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
184f0 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
18500 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
18510 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
18520 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
18530 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
18540 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
18550 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
18560 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
18570 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
18580 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
18590 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
185a0 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
185b0 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
185c0 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
185d0 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
185e0 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
185f0 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
18600 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
18610 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
18620 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
18630 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
18640 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
18650 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
18660 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
18670 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72   data blob separ
18680 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
18690 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
186a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
186b0 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
186c0 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
186d0 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
186e0 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
186f0 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
18700 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
18710 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
18720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
18730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
18740 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
18750 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
18760 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
18770 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
18790 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
187a0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
187b0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
187c0 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
187d0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
187e0 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18800 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
18810 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
18820 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
18830 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
18840 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
18850 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18870 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
18880 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
18890 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
188b0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
188c0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
188d0 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
188e0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
188f0 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
18900 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
18920 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
18930 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
18940 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
18960 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
18970 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
18980 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
18990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189a0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
189b0 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
189c0 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
189d0 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
189e0 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
189f0 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
18a00 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
18a10 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
18a20 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
18a30 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
18a40 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
18a50 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
18a60 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
18a70 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
18a80 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
18a90 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
18aa0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
18ab0 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
18ac0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
18ad0 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
18ae0 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
18af0 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
18b00 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
18b10 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65  format, u32 *pLe
18b20 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  n){.  int flags 
18b30 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
18b40 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72   u32 n;..  asser
18b50 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20  t( pLen!=0 );.  
18b60 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
18b70 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20  ll ){.    *pLen 
18b80 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
18b90 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
18ba0 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
18bb0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
18bc0 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
18bd0 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
18be0 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
18bf0 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
18c00 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
18c10 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
18c20 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
18c30 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
18c40 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
18c50 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c   u = ~i;.    }el
18c60 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b  se{.      u = i;
18c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
18c80 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69  <=127 ){.      i
18c90 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66  f( (i&1)==i && f
18ca0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
18cb0 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d  .        *pLen =
18cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
18cd0 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20  rn 8+(u32)u;.   
18ce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18cf0 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20    *pLen = 1;.   
18d00 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
18d10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18d20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b   if( u<=32767 ){
18d30 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75   *pLen = 2; retu
18d40 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 2; }.    if( 
18d50 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70  u<=8388607 ){ *p
18d60 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20  Len = 3; return 
18d70 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  3; }.    if( u<=
18d80 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70  2147483647 ){ *p
18d90 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20  Len = 4; return 
18da0 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  4; }.    if( u<=
18db0 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c  MAX_6BYTE ){ *pL
18dc0 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35  en = 6; return 5
18dd0 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20  ; }.    *pLen = 
18de0 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  8;.    return 6;
18df0 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
18e00 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
18e10 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20   *pLen = 8;.    
18e20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
18e30 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
18e40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
18e50 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
18e60 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
18e70 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
18e80 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32  =0 );.  n = (u32
18e90 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20  )pMem->n;.  if( 
18ea0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
18eb0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
18ec0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
18ed0 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72    *pLen = n;.  r
18ee0 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
18ef0 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
18f00 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
18f10 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f  .** The sizes fo
18f20 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c  r serial types l
18f30 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a  ess than 128.*/.
18f40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
18f50 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
18f60 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Sizes[] = {.    
18f70 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20      /*  0   1   
18f80 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20  2   3   4   5   
18f90 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f  6   7   8   9 */
18fa0 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20     ./*   0 */   
18fb0 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20  0,  1,  2,  3,  
18fc0 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20  4,  6,  8,  8,  
18fd0 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f  0,  0,./*  10 */
18fe0 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
18ff0 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32  ,  1,  1,  2,  2
19000 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30  ,  3,  3,./*  20
19010 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c   */   4,  4,  5,
19020 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c    5,  6,  6,  7,
19030 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20    7,  8,  8,./* 
19040 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20   30 */   9,  9, 
19050 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20  10, 10, 11, 11, 
19060 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a  12, 12, 13, 13,.
19070 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31  /*  40 */  14, 1
19080 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31  4, 15, 15, 16, 1
19090 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31  6, 17, 17, 18, 1
190a0 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39  8,./*  50 */  19
190b0 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31  , 19, 20, 20, 21
190c0 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33  , 21, 22, 22, 23
190d0 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20  , 23,./*  60 */ 
190e0 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c   24, 24, 25, 25,
190f0 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c   26, 26, 27, 27,
19100 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20   28, 28,./*  70 
19110 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20  */  29, 29, 30, 
19120 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20  30, 31, 31, 32, 
19130 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20  32, 33, 33,./*  
19140 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33  80 */  34, 34, 3
19150 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33  5, 35, 36, 36, 3
19160 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f  7, 37, 38, 38,./
19170 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39  *  90 */  39, 39
19180 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31  , 40, 40, 41, 41
19190 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33  , 42, 42, 43, 43
191a0 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c  ,./* 100 */  44,
191b0 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c   44, 45, 45, 46,
191c0 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c   46, 47, 47, 48,
191d0 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20   48,./* 110 */  
191e0 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20  49, 49, 50, 50, 
191f0 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20  51, 51, 52, 52, 
19200 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a  53, 53,./* 120 *
19210 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35  /  54, 54, 55, 5
19220 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35  5, 56, 56, 57, 5
19230 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  7.};../*.** Retu
19240 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
19250 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
19260 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
19270 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
19280 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ype..*/.u32 sqli
19290 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
192a0 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
192b0 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
192c0 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b  ial_type>=128 ){
192d0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
192e0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
192f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
19300 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
19310 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20  <12 .           
19320 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   || sqlite3Small
19330 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
19340 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f  _type]==(serial_
19350 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a  type - 12)/2 );.
19360 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
19370 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
19380 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
19390 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56   }.}.u8 sqlite3V
193a0 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c  dbeOneByteSerial
193b0 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61  TypeLen(u8 seria
193c0 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72  l_type){.  asser
193d0 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  t( serial_type<1
193e0 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  28 );.  return s
193f0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
19400 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
19410 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ];  .}../*.** If
19420 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
19430 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
19440 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
19450 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
19460 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
19470 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
19480 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
19490 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
194a0 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
194b0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
194c0 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
194d0 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
194e0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
194f0 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
19500 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
19510 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
19520 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
19530 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
19540 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
19550 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
19560 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
19570 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
19580 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
19590 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
195a0 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
195b0 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
195c0 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
195d0 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
195e0 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
195f0 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
19600 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
19610 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
19620 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
19630 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
19640 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
19650 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
19660 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
19670 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
19680 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
19690 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
196a0 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
196b0 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
196c0 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
196d0 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
196e0 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
196f0 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
19700 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
19710 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
19720 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
19730 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
19740 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
19750 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
19760 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
19770 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
19780 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
19790 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
197a0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
197b0 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
197c0 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
197d0 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
197e0 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
197f0 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
19800 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
19810 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
19820 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
19830 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
19840 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
19850 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
19860 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
19870 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
19880 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
19890 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
198a0 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
198b0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
198c0 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
198d0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
198e0 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
198f0 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
19900 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
19910 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
19920 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
19930 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
19940 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
19950 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
19960 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
19970 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
19980 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
19990 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
199a0 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
199b0 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
199c0 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
199d0 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
199e0 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
199f0 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
19a00 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
19a10 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
19a20 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
19a30 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
19a40 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
19a50 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
19a60 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
19a70 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
19a80 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
19a90 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
19aa0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
19ab0 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
19ac0 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
19ad0 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
19ae0 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
19af0 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
19b00 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
19b10 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
19b20 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
19b30 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
19b40 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
19b50 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
19b60 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
19b70 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19b80 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
19b90 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
19ba0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
19bb0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
19bc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
19bd0 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
19be0 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
19bf0 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
19c00 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
19c10 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
19c20 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
19c30 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
19c40 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
19c50 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
19c60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19c70 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
19c80 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
19c90 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
19ca0 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
19cb0 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
19cc0 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72  sponsible.** for
19cd0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75   allocating enou
19ce0 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b  gh space to buf[
19cf0 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  ] to hold the en
19d00 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c  tire field, excl
19d10 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20  usive.** of the 
19d20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79  pMem->u.nZero by
19d30 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65  tes for a MEM_Ze
19d40 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ro value..**.** 
19d50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
19d60 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
19d70 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
19d80 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
19d90 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
19da0 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
19db0 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
19dc0 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
19dd0 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
19de0 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
19df0 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
19e00 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
19e10 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
19e20 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a  t(u8 *buf, Mem *
19e30 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c  pMem, u32 serial
19e40 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65  _type){.  u32 le
19e50 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
19e60 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
19e70 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
19e80 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
19e90 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
19ea0 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20  .    u32 i;.    
19eb0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
19ec0 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
19ed0 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73  rt( sizeof(v)==s
19ee0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
19ef0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
19f00 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c  (&v, &pMem->u.r,
19f10 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
19f20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
19f30 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
19f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
19f50 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
19f60 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
19f70 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
19f80 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
19f90 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e];.    assert( 
19fa0 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  i>0 );.    do{. 
19fb0 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20       buf[--i] = 
19fc0 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
19fd0 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
19fe0 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20   }while( i );.  
19ff0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
1a000 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
1a010 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
1a020 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
1a030 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a040 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
1a050 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1a060 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
1a070 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
1a080 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
1a090 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1a0a0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
1a0b0 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
1a0c0 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  ->n;.    if( len
1a0d0 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c  >0 ) memcpy(buf,
1a0e0 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
1a0f0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
1a100 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
1a110 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
1a120 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
1a130 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78  ;.}../* Input "x
1a140 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20  " is a sequence 
1a150 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  of unsigned char
1a160 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72  acters that repr
1a170 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65  esent a.** big-e
1a180 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ndian integer.  
1a190 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76  Return the equiv
1a1a0 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74  alent native int
1a1b0 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  eger.*/.#define 
1a1c0 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  ONE_BYTE_INT(x) 
1a1d0 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a     ((i8)(x)[0]).
1a1e0 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45  #define TWO_BYTE
1a1f0 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a  _INT(x)    (256*
1a200 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29  (i8)((x)[0])|(x)
1a210 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52  [1]).#define THR
1a220 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  EE_BYTE_INT(x)  
1a230 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b  (65536*(i8)((x)[
1a240 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c  0])|((x)[1]<<8)|
1a250 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[2]).#define 
1a260 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78  FOUR_BYTE_UINT(x
1a270 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d  )  (((u32)(x)[0]
1a280 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  <<24)|((x)[1]<<1
1a290 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
1a2a0 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[3]).#define F
1a2b0 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  OUR_BYTE_INT(x) 
1a2c0 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28  (16777216*(i8)((
1a2d0 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
1a2e0 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1a2f0 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44  (x)[3])../*.** D
1a300 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
1a310 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
1a320 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
1a330 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
1a340 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
1a350 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
1a360 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
1a370 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1a380 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  es read..**.** T
1a390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a3a0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74  implemented as t
1a3b0 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74  wo separate rout
1a3c0 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d  ines for perform
1a3d0 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77  ance..** The few
1a3e0 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75   cases that requ
1a3f0 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  ire local variab
1a400 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f  les are broken o
1a410 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61  ut into a separa
1a420 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f  te.** routine so
1a430 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61   that in most ca
1a440 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64  ses the overhead
1a450 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73   of moving the s
1a460 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  tack pointer.** 
1a470 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a  is avoided..*/ .
1a480 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54  static u32 SQLIT
1a490 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61  E_NOINLINE seria
1a4a0 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
1a4b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
1a4c0 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
1a4d0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
1a4e0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
1a4f0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
1a500 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1a510 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
1a520 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
1a530 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
1a540 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
1a550 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
1a560 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
1a570 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f  .  u64 x = FOUR_
1a580 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a  BYTE_UINT(buf);.
1a590 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42    u32 y = FOUR_B
1a5a0 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b  YTE_UINT(buf+4);
1a5b0 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b  .  x = (x<<32) +
1a5c0 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c   y;.  if( serial
1a5d0 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
1a5e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a5f0 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61  R-29851-52272 Va
1a600 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1a610 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  ian 64-bit.    *
1a620 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a630 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a640 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
1a650 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65  i64*)&x;.    pMe
1a660 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a670 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  nt;.    testcase
1a680 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1a6a0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a6b0 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75  57343-49114 Valu
1a6c0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a6d0 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20  n IEEE 754-2008 
1a6e0 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c  64-bit.    ** fl
1a6f0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
1a700 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66  ber. */.#if !def
1a710 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
1a720 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1a730 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1a740 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69  INT).    /* Veri
1a750 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
1a760 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
1a770 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
1a780 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62  he same.    ** b
1a790 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
1a7a0 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
1a7b0 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
1a7c0 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a  T_FLOAT is.    *
1a7d0 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
1a7e0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
1a7f0 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
1a800 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
1a810 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
1a820 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
1a830 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
1a840 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
1a850 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  32;.    static c
1a860 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
1a870 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32   1.0;.    u64 t2
1a880 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d   = t1;.    swapM
1a890 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1a8a0 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t2);.    assert(
1a8b0 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
1a8c0 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
1a8d0 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
1a8e0 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
1a8f0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
1a900 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
1a910 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e   sizeof(pMem->u.
1a920 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61  r)==8 );.    swa
1a930 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1a940 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  t(x);.    memcpy
1a950 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c  (&pMem->u.r, &x,
1a960 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
1a970 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
1a980 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
1a990 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  ->u.r) ? MEM_Nul
1a9a0 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
1a9b0 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a  }.  return 8;.}.
1a9c0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1a9d0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
1a9e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1a9f0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
1aa00 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
1aa10 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
1aa20 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
1aa30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1aa40 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
1aa50 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
1aa60 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1aa80 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
1aa90 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
1aaa0 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
1aab0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1aac0 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a 20    case 10: { /* 
1aad0 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c  Internal use onl
1aae0 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69 72  y: NULL with vir
1aaf0 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
1ab00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50 44            ** UPD
1ab10 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66 6c  ATE no-change fl
1ab20 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  ag set */.      
1ab30 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1ab40 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b  M_Null|MEM_Zero;
1ab50 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
1ab60 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   0;.      pMem->
1ab70 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20  u.nZero = 0;.   
1ab80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ab90 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
1aba0 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
1abb0 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
1abc0 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
1abd0 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ull */.      /* 
1abe0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1abf0 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65  4078-09375 Value
1ac00 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20   is a NULL. */. 
1ac10 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1ac20 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
1ac30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ac40 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
1ac50 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1ac60 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39  OF: R-44885-2519
1ac70 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d  6 Value is an 8-
1ac80 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d  bit twos-complem
1ac90 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  ent.      ** int
1aca0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1acb0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42  Mem->u.i = ONE_B
1acc0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1acd0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1ace0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1acf0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1ad00 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1ad10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1ad20 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1ad30 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1ad40 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1ad50 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1ad60 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61  R-49794-35026 Va
1ad70 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1ad80 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20  ian 16-bit.     
1ad90 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1ada0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1adb0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1adc0 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  = TWO_BYTE_INT(b
1add0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1ade0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1adf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ae00 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1ae10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
1ae20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ae30 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
1ae40 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1ae50 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1ae60 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35  CE-OF: R-37839-5
1ae70 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20  4301 Value is a 
1ae80 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69  big-endian 24-bi
1ae90 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1aea0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1aeb0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1aec0 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42  m->u.i = THREE_B
1aed0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1aee0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1aef0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1af00 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1af10 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1af20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
1af30 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1af40 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1af50 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1af60 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1af70 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61  R-01849-26079 Va
1af80 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1af90 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20  ian 32-bit.     
1afa0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1afb0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1afc0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1afd0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
1afe0 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48  buf);.#ifdef __H
1aff0 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57  P_cc .      /* W
1b000 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67  ork around a sig
1b010 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20  n-extension bug 
1b020 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c  in the HP compil
1b030 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a  er for HP/UX */.
1b040 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d        if( buf[0]
1b050 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e  &0x80 ) pMem->u.
1b060 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38  i |= 0xffffffff8
1b070 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69  0000000LL;.#endi
1b080 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  f.      pMem->fl
1b090 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1b0a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b0b0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1b0c0 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
1b0d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1b0e0 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1b0f0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1b100 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1b110 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37  OF: R-50385-0967
1b120 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1b130 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20  -endian 48-bit. 
1b140 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1b150 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1b160 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1b170 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1b180 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28  UINT(buf+2) + ((
1b190 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1b1a0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1b1b0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1b1c0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1b1d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1b1e0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1b1f0 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
1b200 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
1b210 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1b220 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1b230 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
1b240 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
1b250 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   */.      /* The
1b260 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72  se use local var
1b270 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68  iables, so do th
1b280 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  em in a separate
1b290 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a   routine.      *
1b2a0 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e  * to avoid havin
1b2b0 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72  g to move the fr
1b2c0 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ame pointer in t
1b2d0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
1b2e0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  /.      return s
1b2f0 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72  erialGet(buf,ser
1b300 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a  ial_type,pMem);.
1b310 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
1b320 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
1b330 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
1b340 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
1b350 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1b360 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37  DENCE-OF: R-1297
1b370 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73  6-22893 Value is
1b380 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20   the integer 0. 
1b390 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1b3a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33  ENCE-OF: R-18143
1b3b0 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20  -12121 Value is 
1b3c0 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a  the integer 1. *
1b3d0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1b3e0 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
1b3f0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
1b400 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1b410 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1b420 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
1b430 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t: {.      /* EV
1b440 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36  IDENCE-OF: R-146
1b450 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69  06-31564 Value i
1b460 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73  s a BLOB that is
1b470 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20   (N-12)/2 bytes 
1b480 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67  in.      ** leng
1b490 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49  th..      ** EVI
1b4a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30  DENCE-OF: R-2840
1b4b0 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73  1-00140 Value is
1b4c0 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65   a string in the
1b4d0 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
1b4e0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31  nd.      ** (N-1
1b4f0 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65  3)/2 bytes in le
1b500 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ngth. */.      s
1b510 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
1b520 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
1b530 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20  Blob|MEM_Ephem, 
1b540 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65  MEM_Str|MEM_Ephe
1b550 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  m };.      pMem-
1b560 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
1b570 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1b580 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
1b590 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
1b5a0 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
1b5b0 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a  serial_type&1];.
1b5c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65        return pMe
1b5d0 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  m->n;.    }.  }.
1b5e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a    return 0;.}./*
1b5f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b600 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
1b610 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20  cate sufficient 
1b620 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70  space for an Unp
1b630 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
1b640 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65  tructure large e
1b650 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64  nough to be used
1b660 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62   with sqlite3Vdb
1b670 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
1b680 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  if.** the first 
1b690 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1b6a0 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f  inter to KeyInfo
1b6b0 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49   structure pKeyI
1b6c0 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nfo..**.** The s
1b6d0 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61  pace is either a
1b6e0 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
1b6f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1b700 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  w() or from with
1b710 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67  in.** the unalig
1b720 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65  ned buffer passe
1b730 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
1b740 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
1b750 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79  ents (presumably
1b760 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29  .** stack space)
1b770 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c  . If the former,
1b780 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73   then *ppFree is
1b790 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65   set to a pointe
1b7a0 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  r that should.**
1b7b0 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
1b7c0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1b7d0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1b7e0 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66  DbFree(). Or, if
1b7f0 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
1b800 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
1b810 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63  he pSpace/szSpac
1b820 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65  e buffer, *ppFre
1b830 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1b840 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
1b850 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1b860 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
1b870 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
1b880 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65  rned..*/.Unpacke
1b890 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
1b8a0 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1b8b0 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e  dRecord(.  KeyIn
1b8c0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1b8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1b8e0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1b8f0 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
1b900 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1b910 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1b920 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
1b930 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
1b940 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b970 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
1b980 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20  r *p */.  nByte 
1b990 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
1b9a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1b9b0 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
1b9c0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1b9d0 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55  eld+1);.  p = (U
1b9e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29  npackedRecord *)
1b9f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1ba00 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
1ba10 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21   nByte);.  if( !
1ba20 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
1ba30 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
1ba40 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
1ba50 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1ba60 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
1ba70 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1ba80 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1ba90 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
1baa0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
1bab0 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
1bac0 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20  fo->nKeyField + 
1bad0 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
1bae0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1baf0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
1bb00 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
1bb10 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
1bb20 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
1bb30 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
1bb40 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1bb50 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
1bb60 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
1bb70 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1bb80 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
1bb90 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
1bba0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1bbb0 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
1bbc0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
1bbd0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1bbe0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
1bbf0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
1bc00 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1bc10 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1bc20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1bc30 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1bc40 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1bc50 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1bc60 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1bc70 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
1bc80 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
1bc90 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
1bca0 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
1bcb0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bcc0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1bcd0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1bce0 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
1bcf0 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1bd20 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
1bd30 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
1bd40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1bd60 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1bd70 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
1bd80 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
1bd90 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
1bda0 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
1bdb0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1bdc0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1bdd0 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
1bde0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1bdf0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
1be00 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
1be10 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1be20 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  Hdr && d<=nKey )
1be30 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1be40 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
1be50 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1be60 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
1be70 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
1be80 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
1be90 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
1bea0 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
1beb0 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
1bec0 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
1bed0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1bee0 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
1bef0 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
1bf00 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
1bf10 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  c = 0;.    pMem-
1bf20 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  >z = 0;.    d +=
1bf30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1bf40 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
1bf50 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
1bf60 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
1bf70 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
1bf80 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
1bf90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1bfa0 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  u<=pKeyInfo->nKe
1bfb0 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20  yField + 1 );.  
1bfc0 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d  p->nField = u;.}
1bfd0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1bfe0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
1bff0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1c000 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
1c010 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
1c020 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
1c030 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
1c040 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c050 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
1c060 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
1c070 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
1c080 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1c090 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
1c0a0 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
1c0b0 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
1c0c0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1c0d0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
1c0e0 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
1c0f0 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
1c100 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
1c110 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
1c120 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
1c130 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
1c140 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
1c150 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
1c160 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
1c170 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
1c180 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  itives..**.** Re
1c190 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1c1a0 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1c1b0 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c  rison is equival
1c1c0 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65  ent to desiredRe
1c1d0 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  sult..** Return 
1c1e0 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69  false if there i
1c1f0 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74  s a disagreement
1c200 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c210 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1c220 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b  eDebug(.  int nK
1c230 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1c240 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1c250 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55  key */.  const U
1c260 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1c270 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20  PKey2, /* Right 
1c280 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  key */.  int des
1c290 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20  iredResult      
1c2a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63         /* Correc
1c2b0 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20  t answer */.){. 
1c2c0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1c2d0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1c2e0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1c2f0 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1c300 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1c310 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1c320 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1c330 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
1c340 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
1c350 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
1c360 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1c370 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1c380 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
1c390 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
1c3a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1c3b0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
1c3c0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1c3d0 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
1c3e0 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
1c3f0 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
1c400 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1c410 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  nfo;.  if( pKeyI
1c420 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  nfo->db==0 ) ret
1c430 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e  urn 1;.  mem1.en
1c440 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1c450 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
1c460 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
1c470 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
1c480 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
1c490 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
1c4a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1c4b0 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
1c4c0 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
1c4d0 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
1c4e0 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
1c4f0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1c500 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
1c510 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
1c520 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
1c530 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
1c540 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
1c550 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
1c560 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
1c570 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
1c580 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
1c590 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
1c5a0 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
1c5b0 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
1c5c0 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
1c5d0 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
1c5e0 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
1c5f0 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
1c600 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
1c610 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
1c620 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
1c630 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
1c640 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c650 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
1c660 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
1c670 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
1c680 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
1c690 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
1c6a0 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
1c6b0 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
1c6c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
1c6d0 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
1c6e0 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
1c6f0 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
1c700 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
1c710 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
1c720 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1c730 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73  szHdr1);.  if( s
1c740 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65  zHdr1>98307 ) re
1c750 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c760 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  UPT;.  d1 = szHd
1c770 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  r1;.  assert( pK
1c780 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1c790 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1c7a0 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  d || CORRUPT_DB 
1c7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1c7c0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1c7d0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1c7e0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  ( pKeyInfo->nKey
1c7f0 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
1c800 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
1c810 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
1c820 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
1c830 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
1c840 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1c850 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
1c860 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
1c870 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
1c880 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
1c890 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
1c8a0 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
1c8b0 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  pe1 );..    /* V
1c8c0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65  erify that there
1c8d0 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73   is enough key s
1c8e0 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74  pace remaining t
1c8f0 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61  o avoid.    ** a
1c900 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
1c910 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61  .  The "d1+seria
1c920 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78  l_type1+2" subex
1c930 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20  pression will.  
1c940 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67    ** always be g
1c950 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1c960 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75  qual to the amou
1c970 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b  nt of required k
1c980 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ey space..    **
1c990 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78   Use that approx
1c9a0 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64  imation to avoid
1c9b0 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73   the more expens
1c9c0 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ive call to.    
1c9d0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
1c9e0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e  rialTypeLen() in
1c9f0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1ca00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ca10 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31   d1+serial_type1
1ca20 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20  +2>(u32)nKey1.  
1ca30 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33     && d1+sqlite3
1ca40 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1ca50 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
1ca60 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20  (u32)nKey1 .    
1ca70 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
1ca80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
1ca90 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
1caa0 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
1cab0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
1cac0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1cad0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1cae0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
1caf0 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
1cb00 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
1cb10 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
1cb20 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
1cb30 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
1cb40 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b  ey2->aMem[i], pK
1cb50 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1cb60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
1cb70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1cb80 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1cb90 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1cba0 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1cbb0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
1cbc0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
1cbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cbe0 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74   -rc;  /* Invert
1cbf0 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20   the result for 
1cc00 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e  DESC sort order.
1cc10 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1cc20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70    goto debugComp
1cc30 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  areEnd;.    }.  
1cc40 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28    i++;.  }while(
1cc50 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
1cc60 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1cc70 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
1cc80 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
1cc90 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
1cca0 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
1ccb0 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
1ccc0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1ccd0 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
1cce0 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
1ccf0 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
1cd00 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
1cd10 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
1cd20 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1cd30 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a  ease(&mem1)..  *
1cd40 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
1cd50 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
1cd60 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1cd70 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1cd80 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1cd90 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1cda0 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1cdb0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1cdc0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1cdd0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1cde0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1cdf0 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  lue.  */.  rc = 
1ce00 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1ce10 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72  rc;..debugCompar
1ce20 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69  eEnd:.  if( desi
1ce30 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20  redResult==0 && 
1ce40 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc==0 ) return 1
1ce50 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1ce60 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20  esult<0 && rc<0 
1ce70 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1ce80 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e  ( desiredResult>
1ce90 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75  0 && rc>0 ) retu
1cea0 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52  rn 1;.  if( CORR
1ceb0 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20  UPT_DB ) return 
1cec0 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  1;.  if( pKeyInf
1ced0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1cee0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
1cef0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1cf00 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1cf10 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1cf20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1cf30 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e   of fields (a.k.
1cf40 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74  a. columns) in t
1cf50 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20  he record given 
1cf60 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e  by.** pKey,nKey.
1cf70 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61    The verify tha
1cf80 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20  t this count is 
1cf90 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1cfa0 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d  al to the.** lim
1cfb0 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79  it given by pKey
1cfc0 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2e  Info->nAllField.
1cfd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63  .**.** If this c
1cfe0 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
1cff0 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d   satisfied, it m
1d000 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69  eans that the hi
1d010 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65  gh-speed.** vdbe
1d020 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1d030 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72  () and vdbeRecor
1d040 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1d050 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a   routines will.*
1d060 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  * not work corre
1d070 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61  ctly.  If this a
1d080 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72  ssert() ever fir
1d090 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20  es, it probably 
1d0a0 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68  means.** that th
1d0b0 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46 69  e KeyInfo.nKeyFi
1d0c0 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1d0d0 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65 73 20  AllField values 
1d0e0 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  were computed.**
1d0f0 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f   incorrectly..*/
1d100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
1d110 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1d120 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20  tWithinLimits(. 
1d130 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74   int nKey, const
1d140 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1d150 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20  * The record to 
1d160 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e  verify */ .  con
1d170 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
1d180 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f  Info       /* Co
1d190 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20  mpare size with 
1d1a0 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a  this KeyInfo */.
1d1b0 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20  ){.  int nField 
1d1c0 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72  = 0;.  u32 szHdr
1d1d0 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
1d1e0 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f  32 notUsed;.  co
1d1f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1d200 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
1d210 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
1d220 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52  pKey;..  if( COR
1d230 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1d240 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1d250 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1d260 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  r);.  assert( nK
1d270 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
1d280 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e  t( szHdr<=(u32)n
1d290 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  Key );.  while( 
1d2a0 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20  idx<szHdr ){.   
1d2b0 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1d2c0 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f  t32(aKey+idx, no
1d2d0 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65  tUsed);.    nFie
1d2e0 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ld++;.  }.  asse
1d2f0 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b  rt( nField <= pK
1d300 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1d310 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  d );.}.#else.# d
1d320 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74  efine vdbeAssert
1d330 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1d340 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65  Limits(A,B,C).#e
1d350 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
1d360 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
1d370 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
1d380 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
1d390 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
1d3a0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
1d3b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1d3c0 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
1d3d0 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
1d3e0 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
1d3f0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
1d400 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
1d410 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1d420 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1d430 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
1d440 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
1d450 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
1d460 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
1d470 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
1d480 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
1d490 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1d4a0 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1d4b0 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
1d4c0 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
1d4d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c   CollSeq *pColl,
1d4e0 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20  .  u8 *prcErr   
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20     /* If an OOM 
1d510 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53  occurs, set to S
1d520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29  QLITE_NOMEM */.)
1d530 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
1d540 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
1d550 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
1d560 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
1d570 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
1d580 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
1d590 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
1d5a0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1d5b0 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
1d5c0 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
1d5d0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1d5e0 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
1d5f0 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
1d600 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
1d610 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
1d620 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
1d630 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  v2;.    Mem c1;.
1d640 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
1d650 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1d660 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c1, pMem1->d
1d670 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1d680 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1d690 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d  Init(&c2, pMem1-
1d6a0 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1d6b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1d6c0 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1d6d0 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70  1, pMem1, MEM_Ep
1d6e0 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hem);.    sqlite
1d6f0 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1d700 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20  opy(&c2, pMem2, 
1d710 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1d720 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v1 = sqlite3Valu
1d730 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1d740 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c  alue*)&c1, pColl
1d750 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32 20 3d  ->enc);.    v2 =
1d760 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1d770 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
1d780 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c2, pColl->en
1d790 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d  c);.    if( (v1=
1d7a0 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b 0a  =0 || v2==0) ){.
1d7b0 20 20 20 20 20 20 69 66 28 20 70 72 63 45 72 72        if( prcErr
1d7c0 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c   ) *prcErr = SQL
1d7d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1d7e0 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
1d7f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d800 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  c = pColl->xCmp(
1d810 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63 31  pColl->pUser, c1
1d820 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76 32  .n, v1, c2.n, v2
1d830 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1d840 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1d850 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c  se(&c1);.    sql
1d860 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1d870 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74  se(&c2);.    ret
1d880 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  urn rc;.  }.}../
1d890 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70  *.** The input p
1d8a0 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74 65  Blob is guarante
1d8b0 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62 20  ed to be a Blob 
1d8c0 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b  that is not mark
1d8d0 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a  ed.** with MEM_Z
1d8e0 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ero.  Return tru
1d8f0 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62 65  e if it could be
1d900 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f   a zero-blob..*/
1d910 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 6c  .static int isAl
1d920 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61 72  lZero(const char
1d930 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
1d940 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1d950 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1d960 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75 72  if( z[i] ) retur
1d970 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1d980 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 1;.}../*.** Co
1d990 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e  mpare two blobs.
1d9a0 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1d9b0 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1d9c0 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1d9d0 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61  t.** is less tha
1d9e0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1d9f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1da00 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74   second, respect
1da10 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65  ively..** If one
1da20 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69   blob is a prefi
1da30 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
1da40 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72  then the shorter
1da50 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a   is the lessor..
1da60 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
1da70 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71  _NOINLINE int sq
1da80 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1da90 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c  (const Mem *pB1,
1daa0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29   const Mem *pB2)
1dab0 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  {.  int c;.  int
1dac0 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20   n1 = pB1->n;.  
1dad0 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b  int n2 = pB2->n;
1dae0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73  ..  /* It is pos
1daf0 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20  sible to have a 
1db00 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20  Blob value that 
1db10 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72  has some non-zer
1db20 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66  o content.  ** f
1db30 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
1db40 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68  content.  But th
1db50 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70  at only comes up
1db60 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65   for Blobs forme
1db70 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50  d.  ** by the OP
1db80 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1db90 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f  de, and such Blo
1dba0 62 73 20 6e 65 76 65 72 20 67 65 74 20 70 61 73  bs never get pas
1dbb0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
1dbc0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1dbd0 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
1dbe0 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  (pB1->flags & ME
1dbf0 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31  M_Zero)==0 || n1
1dc00 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1dc10 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d   (pB2->flags & M
1dc20 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e  EM_Zero)==0 || n
1dc30 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  2==0 );..  if( (
1dc40 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e  pB1->flags|pB2->
1dc50 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72  flags) & MEM_Zer
1dc60 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31  o ){.    if( pB1
1dc70 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66  ->flags & pB2->f
1dc80 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1dc90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1dca0 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70  pB1->u.nZero - p
1dcb0 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  B2->u.nZero;.   
1dcc0 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e   }else if( pB1->
1dcd0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1dce0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
1dcf0 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c  sAllZero(pB2->z,
1dd00 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72   pB2->n) ) retur
1dd10 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n -1;.      retu
1dd20 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20  rn pB1->u.nZero 
1dd30 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  - n2;.    }else{
1dd40 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c  .      if( !isAl
1dd50 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42  lZero(pB1->z, pB
1dd60 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b  1->n) ) return +
1dd70 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1dd80 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72  n1 - pB2->u.nZer
1dd90 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  o;.    }.  }.  c
1dda0 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a   = memcmp(pB1->z
1ddb0 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20  , pB2->z, n1>n2 
1ddc0 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66  ? n2 : n1);.  if
1ddd0 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a  ( c ) return c;.
1dde0 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32    return n1 - n2
1ddf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1de00 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
1de10 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e  en a 64-bit sign
1de20 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61  ed integer and a
1de30 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1de40 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72  -point.** number
1de50 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1de60 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1de70 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1de80 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73  st (i64) is less
1de90 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20   than,.** equal 
1dea0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1deb0 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28  han the second (
1dec0 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  double)..*/.stat
1ded0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  ic int sqlite3In
1dee0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36  tFloatCompare(i6
1def0 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a  4 i, double r){.
1df00 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e    if( sizeof(LON
1df10 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20  GDOUBLE_TYPE)>8 
1df20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c  ){.    LONGDOUBL
1df30 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47  E_TYPE x = (LONG
1df40 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20  DOUBLE_TYPE)i;. 
1df50 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74     if( x<r ) ret
1df60 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1df70 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  x>r ) return +1;
1df80 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1df90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1dfa0 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b  y;.    double s;
1dfb0 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33  .    if( r<-9223
1dfc0 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e  372036854775808.
1dfd0 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  0 ) return +1;. 
1dfe0 20 20 20 69 66 28 20 72 3e 39 32 32 33 33 37 32     if( r>9223372
1dff0 30 33 36 38 35 34 37 37 35 38 30 37 2e 30 20 29  036854775807.0 )
1e000 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1e010 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20  y = (i64)r;.    
1e020 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e  if( i<y ) return
1e030 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79   -1;.    if( i>y
1e040 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d   ){.      if( y=
1e050 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
1e060 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72  && r>0.0 ) retur
1e070 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n -1;.      retu
1e080 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn +1;.    }.   
1e090 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a   s = (double)i;.
1e0a0 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65      if( s<r ) re
1e0b0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1e0c0 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   s>r ) return +1
1e0d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1e0e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1e0f0 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
1e100 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
1e110 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
1e120 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
1e130 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
1e140 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
1e150 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1e160 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1e170 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
1e180 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
1e190 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
1e1a0 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
1e1b0 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
1e1c0 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
1e1d0 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
1e1e0 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
1e1f0 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
1e200 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
1e210 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  * sequence pColl
1e220 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f   and finally blo
1e230 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
1e240 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
1e250 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
1e260 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1e270 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
1e280 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1e290 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63  ite3MemCompare(c
1e2a0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1e2b0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1e2c0 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  2, const CollSeq
1e2d0 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20   *pColl){.  int 
1e2e0 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
1e2f0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
1e300 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61   f1 = pMem1->fla
1e310 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32  gs;.  f2 = pMem2
1e320 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69  ->flags;.  combi
1e330 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66  ned_flags = f1|f
1e340 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f  2;.  assert( (co
1e350 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d  mbined_flags & M
1e360 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b  EM_RowSet)==0 );
1e370 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
1e380 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
1e390 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1e3a0 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
1e3b0 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
1e3c0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
1e3d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1e3e0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
1e3f0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
1e400 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20  n (f2&MEM_Null) 
1e410 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b  - (f1&MEM_Null);
1e420 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65  .  }..  /* At le
1e430 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  ast one of the t
1e440 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e  wo values is a n
1e450 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28  umber.  */.  if(
1e460 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1e470 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
1e480 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  l) ){.    if( (f
1e490 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74  1 & f2 & MEM_Int
1e4a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1e4b0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70  ( pMem1->u.i < p
1e4c0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1e4d0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1e4e0 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d   pMem1->u.i > pM
1e4f0 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1e500 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1e510 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1e520 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1e530 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1e540 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1e550 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r < pMem2->u.r
1e560 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1e570 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1e580 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20  .r > pMem2->u.r 
1e590 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1e5a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1e5b0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1e5c0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1e5d0 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1e5e0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1e5f0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1e600 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1e610 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d  e(pMem1->u.i, pM
1e620 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em2->u.r);.     
1e630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e640 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1e650 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1e660 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
1e670 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1e680 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f2&MEM_Int)!=0 )
1e690 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1e6a0 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
1e6b0 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e  tCompare(pMem2->
1e6c0 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29  u.i, pMem1->u.r)
1e6d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e6e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
1e6f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e700 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20      return +1;. 
1e710 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
1e720 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
1e730 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  g and the other 
1e740 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73  is a blob, the s
1e750 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20  tring is less.. 
1e760 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
1e770 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65  strings, compare
1e780 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1e790 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ting functions..
1e7a0 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1e7b0 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74  ned_flags&MEM_St
1e7c0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  r ){.    if( (f1
1e7d0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1e7e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1e7f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e800 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f2 & MEM_Str)==
1e810 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1e820 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
1e830 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1e840 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20  enc==pMem2->enc 
1e850 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61  || pMem1->db->ma
1e860 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1e870 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1e880 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1e890 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  8 || .          
1e8a0 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51    pMem1->enc==SQ
1e8b0 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20  LITE_UTF16LE || 
1e8c0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1e8d0 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20  TE_UTF16BE );.. 
1e8e0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
1e8f0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ion sequence mus
1e900 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20  t be defined at 
1e910 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e  this point, even
1e920 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75   if.    ** the u
1e930 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20  ser deletes the 
1e940 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e950 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62  ce after the vdb
1e960 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20  e program is.   
1e970 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68   ** compiled (th
1e980 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79  is was not alway
1e990 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20  s the case)..   
1e9a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1e9b0 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d  !pColl || pColl-
1e9c0 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66  >xCmp );..    if
1e9d0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1e9e0 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70   return vdbeComp
1e9f0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65  areMemString(pMe
1ea00 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c  m1, pMem2, pColl
1ea10 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1ea20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69  /* If a NULL poi
1ea30 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20  nter was passed 
1ea40 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66  as the collate f
1ea50 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68  unction, fall th
1ea60 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20  rough.    ** to 
1ea70 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e  the blob case an
1ea80 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20  d use memcmp(). 
1ea90 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42   */.  }. .  /* B
1eaa0 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
1eab0 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61  be blobs.  Compa
1eac0 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  re using memcmp(
1ead0 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ).  */.  return 
1eae0 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1eaf0 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29  re(pMem1, pMem2)
1eb00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1eb10 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
1eb20 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1eb30 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
1eb40 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
1eb50 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
1eb60 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
1eb70 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
1eb80 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
1eb90 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
1eba0 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
1ebb0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1ebc0 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
1ebd0 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
1ebe0 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
1ebf0 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
1ec00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
1ec10 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
1ec20 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
1ec30 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1ec40 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
1ec50 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
1ec60 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
1ec70 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
1ec80 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
1ec90 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
1eca0 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
1ecb0 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
1ecc0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
1ecd0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1ece0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1ecf0 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
1ed00 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
1ed10 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1ed20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1ed30 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
1ed40 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
1ed50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ed60 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1ed70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
1ed80 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1ed90 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
1eda0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1edb0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1edc0 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
1edd0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1ede0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
1edf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1ee00 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1ee10 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
1ee20 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1ee30 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1ee40 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1ee50 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
1ee60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee70 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1ee80 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
1ee90 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1eea0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1eeb0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1eec0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
1eed0 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
1eee0 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
1eef0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1ef00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ef10 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1ef20 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1ef30 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1ef40 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1ef50 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1ef60 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
1ef70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
1ef80 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
1ef90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1efa0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1efb0 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
1efc0 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
1efd0 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
1efe0 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
1eff0 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
1f000 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
1f010 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
1f020 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
1f030 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
1f040 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1f050 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
1f060 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
1f070 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
1f080 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
1f090 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
1f0a0 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
1f0b0 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
1f0c0 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b  e VDBE.  The pPK
1f0d0 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20  ey2.** key must 
1f0e0 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20  be a parsed key 
1f0f0 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64  such as obtained
1f100 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1f110 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e  VdbeParseRecord.
1f120 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
1f130 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  nt bSkip is non-
1f140 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75  zero, it is assu
1f150 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
1f160 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ler has already.
1f170 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  ** determined th
1f180 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65  at the first fie
1f190 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20  lds of the keys 
1f1a0 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a  are equal..**.**
1f1b0 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
1f1c0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
1f1d0 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
1f1e0 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
1f1f0 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c   If all .** fiel
1f200 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ds that appear i
1f210 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20  n both keys are 
1f220 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65  equal, then pPKe
1f230 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
1f240 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
1f250 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73  **.** If databas
1f260 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1f270 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20  discovered, set 
1f280 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1f290 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  to .** SQLITE_CO
1f2a0 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e  RRUPT and return
1f2b0 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72   0. If an OOM er
1f2c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1f2d0 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e  ed, .** pPKey2->
1f2e0 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74  errCode is set t
1f2f0 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
1f300 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nd, if it is not
1f310 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61   NULL, the.** ma
1f320 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
1f330 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65   set on database
1f340 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d   handle (pPKey2-
1f350 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a  >pKeyInfo->db)..
1f360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1f370 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1f380 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e  ithSkip(.  int n
1f390 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1f3a0 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1f3b0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1f3c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1f3d0 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2,         /* R
1f3e0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1f3f0 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f410 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74   If true, skip t
1f420 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a  he first field *
1f430 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1f460 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1f470 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1f480 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1f4b0 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f  of next field to
1f4c0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33   compare */.  u3
1f4d0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4f0 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
1f500 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
1f510 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1f540 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20  f first type in 
1f550 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1f560 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1f570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f580 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
1f590 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b   Mem *pRhs = pPK
1f5a0 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  ey2->aMem;      
1f5b0 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f   /* Next field o
1f5c0 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70  f pPKey2 to comp
1f5d0 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  are */.  KeyInfo
1f5e0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   *pKeyInfo = pPK
1f5f0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1f600 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f610 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
1f620 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1f630 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65  ar *)pKey1;.  Me
1f640 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66  m mem1;..  /* If
1f650 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20   bSkip is true, 
1f660 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1f670 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65  has already dete
1f680 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1f690 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65  first.  ** two e
1f6a0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b  lements in the k
1f6b0 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46  eys are equal. F
1f6c0 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  ix the various s
1f6d0 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73  tack variables s
1f6e0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  o.  ** that this
1f6f0 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20   routine begins 
1f700 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65  comparing at the
1f710 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a   second field. *
1f720 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b  /.  if( bSkip ){
1f730 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20  .    u32 s1;.   
1f740 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56   idx1 = 1 + getV
1f750 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
1f760 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64  ], s1);.    szHd
1f770 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20  r1 = aKey1[0];. 
1f780 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b     d1 = szHdr1 +
1f790 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1f7a0 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20  alTypeLen(s1);. 
1f7b0 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52     i = 1;.    pR
1f7c0 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hs++;.  }else{. 
1f7d0 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72     idx1 = getVar
1f7e0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1f7f0 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73  dr1);.    d1 = s
1f800 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64  zHdr1;.    if( d
1f810 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
1f820 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65  1 ){ .      pPKe
1f830 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1f840 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1f850 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1f860 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
1f870 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1f880 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20     i = 0;.  }.. 
1f890 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
1f8a0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  szMalloc = 0; ) 
1f8b0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1f8c0 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1f8d0 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  ments */.  asser
1f8e0 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1f8f0 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d  nfo->nAllField>=
1f900 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a  pPKey2->nField .
1f910 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1f920 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1f930 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1f940 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1f950 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1f960 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1f970 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a  >nKeyField>0 );.
1f980 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1f990 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1f9a0 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1f9b0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1f9c0 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1f9d0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1f9e0 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1f9f0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1fa00 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1fa10 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1fa20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fa30 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1fa40 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1fa50 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1fa60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1fa70 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1fa80 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1fa90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1faa0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1fab0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1fac0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1fad0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1fae0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1faf0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1fb00 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em1);.        rc
1fb10 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c   = -sqlite3IntFl
1fb20 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d  oatCompare(pRhs-
1fb30 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b  >u.i, mem1.u.r);
1fb40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fb50 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1fb60 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1fb70 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1fb80 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1fb90 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1fba0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1fbb0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1fbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1fbd0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1fbe0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1fbf0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1fc00 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1fc10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fc20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1fc30 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1fc40 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1fc50 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1fc60 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1fc70 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1fc80 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1fc90 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1fca0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
1fcb0 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
1fcc0 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
1fcd0 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
1fce0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
1fcf0 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
1fd00 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
1fd10 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
1fd20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
1fd30 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
1fd40 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
1fd50 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
1fd60 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
1fd70 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
1fd80 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
1fd90 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
1fda0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1fdb0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1fdc0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1fdd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1fde0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1fdf0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1fe00 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1fe10 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1fe20 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1fe30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
1fe40 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1fe50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65            if( me
1fe60 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72  m1.u.r<pRhs->u.r
1fe70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fe80 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1fe90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d     }else if( mem
1fea0 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20  1.u.r>pRhs->u.r 
1feb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1fec0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1fed0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1fee0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
1fef0 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  = sqlite3IntFloa
1ff00 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e  tCompare(mem1.u.
1ff10 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20  i, pRhs->u.r);. 
1ff20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ff30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1ff40 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
1ff50 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1ff60 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1ff70 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
1ff80 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1ff90 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1ffa0 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1ffb0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1ffc0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1ffd0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1ffe0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1fff0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
20000 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
20010 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
20020 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
20030 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20040 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
20050 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
20060 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
20070 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
20080 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
20090 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
200a0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
200b0 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
200c0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
200d0 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
200e0 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
200f0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
20100 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
20110 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
20120 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20130 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
20140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20150 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
20160 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
20170 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  if( pKeyInfo->aC
20180 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
20190 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70      mem1.enc = p
201a0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
201b0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20          mem1.db 
201c0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
201d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66            mem1.f
201e0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a  lags = MEM_Str;.
201f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a            mem1.z
20200 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31   = (char*)&aKey1
20210 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [d1];.          
20220 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65  rc = vdbeCompare
20230 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20  MemString(.     
20240 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20           &mem1, 
20250 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  pRhs, pKeyInfo->
20260 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79  aColl[i], &pPKey
20270 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  2->errCode.     
20280 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
20290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
202a0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
202b0 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29  mem1.n, pRhs->n)
202c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
202d0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
202e0 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
202f0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
20300 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d  ( rc==0 ) rc = m
20310 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b  em1.n - pRhs->n;
20320 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
20330 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
20340 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20  * RHS is a blob 
20350 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
20360 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
20370 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
20380 61 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66  assert( (pRhs->f
20390 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
203a0 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d  ==0 || pRhs->n==
203b0 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61  0 );.      getVa
203c0 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
203d0 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
203e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
203f0 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
20400 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
20410 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c  serial_type<12 |
20420 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26  | (serial_type &
20430 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
20440 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
20450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20460 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69  int nStr = (seri
20470 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
20480 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
20490 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d  ase( (d1+nStr)==
204a0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
204b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
204c0 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29  ase( (d1+nStr+1)
204d0 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
204e0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
204f0 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e   (d1+nStr) > (un
20500 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
20510 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
20520 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20530 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20540 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
20550 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
20560 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
20570 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
20580 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d   }else if( pRhs-
20590 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
205a0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  o ){.          i
205b0 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63  f( !isAllZero((c
205c0 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79  onst char*)&aKey
205d0 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20  1[d1],nStr) ){. 
205e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
205f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
20600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
20610 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
20620 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20  ->u.nZero;.     
20630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20650 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  int nCmp = MIN(n
20660 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  Str, pRhs->n);. 
20670 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
20680 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
20690 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
206a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
206b0 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72  c==0 ) rc = nStr
206c0 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20   - pRhs->n;.    
206d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
206e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
206f0 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65  is null */.    e
20700 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61  lse{.      seria
20710 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
20720 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  dx1];.      rc =
20730 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30   (serial_type!=0
20740 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
20750 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
20760 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
20770 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
20780 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
20790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
207a0 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
207b0 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
207c0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
207d0 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20  ey2, rc) );.    
207e0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
207f0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
20800 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
20810 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
20820 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
20830 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73     i++;.    pRhs
20840 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71  ++;.    d1 += sq
20850 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
20860 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
20870 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d  pe);.    idx1 +=
20880 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
20890 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
208a0 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28    }while( idx1<(
208b0 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20  unsigned)szHdr1 
208c0 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
208d0 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69  eld && d1<=(unsi
208e0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20  gned)nKey1 );.. 
208f0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
20900 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
20910 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
20920 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
20930 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
20940 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
20950 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
20960 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
20970 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
20980 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
20990 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
209a0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
209b0 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73  mem1).  */.  ass
209c0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
209d0 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
209e0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
209f0 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68  that one or both
20a00 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
20a10 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
20a20 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
20a30 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
20a40 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
20a50 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
20a60 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
20a70 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alue.  */.  asse
20a80 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a  rt( CORRUPT_DB .
20a90 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65         || vdbeRe
20aa0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
20ab0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20ac0 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64  PKey2, pPKey2->d
20ad0 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20  efault_rc) .    
20ae0 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e     || pKeyInfo->
20af0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20b00 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e  .  );.  pPKey2->
20b10 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65  eqSeen = 1;.  re
20b20 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
20b30 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73  ault_rc;.}.int s
20b40 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20b50 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
20b60 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
20b70 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
20b80 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
20b90 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
20ba0 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2          /* R
20bb0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
20bc0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
20bd0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20be0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
20bf0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
20c00 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
20c10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
20c20 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
20c30 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
20c40 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
20c50 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
20c60 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
20c70 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e   pPKey2 is an in
20c80 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74  teger, and (b) t
20c90 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68  he .** size-of-h
20ca0 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20  eader varint at 
20cb0 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
20cc0 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
20cd0 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62  in a single.** b
20ce0 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73  yte (i.e. is les
20cf0 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a  s than 128)..**.
20d00 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63  ** To avoid conc
20d10 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65  erns about buffe
20d20 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69  r overreads, thi
20d30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
20d40 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68  y used.** on sch
20d50 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d  emas where the m
20d60 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61  aximum valid hea
20d70 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62  der size is 63 b
20d80 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  ytes or less..*/
20d90 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
20da0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20db0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
20dc0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
20dd0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
20de0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
20df0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
20e00 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20e10 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
20e20 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20  aKey = &((const 
20e30 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e  u8*)pKey1)[*(con
20e40 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30  st u8*)pKey1 & 0
20e50 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69  x3F];.  int seri
20e60 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73  al_type = ((cons
20e70 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b  t u8*)pKey1)[1];
20e80 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33  .  int res;.  u3
20e90 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20  2 y;.  u64 x;.  
20ea0 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73  i64 v;.  i64 lhs
20eb0 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
20ec0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
20ed0 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
20ee0 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
20ef0 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
20f00 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
20f10 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
20f20 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
20f30 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
20f40 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
20f50 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
20f60 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
20f70 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
20f80 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
20f90 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20fa0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20fb0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
20fc0 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
20fd0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20fe0 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
20ff0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
21000 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
21010 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
21020 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
21030 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
21040 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
21050 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
21060 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
21070 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
21080 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
21090 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
210a0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
210b0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
210c0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
210d0 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
210e0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
210f0 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
21100 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
21110 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
21120 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21130 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
21140 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
21150 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
21160 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
21170 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
21180 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
21190 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
211a0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
211b0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
211c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
211d0 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
211e0 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
211f0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
21200 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
21210 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
21220 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
21230 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
21240 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
21250 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
21260 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21270 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
21280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
21290 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
212a0 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
212b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
212c0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
212d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
212e0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
212f0 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
21300 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
21310 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
21320 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
21330 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
21340 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
21350 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
21360 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
21370 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
21380 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
21390 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
213a0 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
213b0 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
213c0 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
213d0 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
213e0 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
213f0 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
21400 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
21410 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
21420 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
21430 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
21440 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
21450 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
21460 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
21470 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
21480 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
21490 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
214a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
214b0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
214c0 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
214d0 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
214e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
214f0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
21500 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
21510 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65  .  }..  v = pPKe
21520 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b  y2->aMem[0].u.i;
21530 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
21540 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
21550 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
21560 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
21570 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
21580 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
21590 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
215a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
215b0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
215c0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
215d0 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
215e0 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
215f0 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
21600 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
21610 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
21620 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
21630 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
21640 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
21650 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
21660 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
21670 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
21680 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
21690 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
216a0 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
216b0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
216c0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
216d0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
216e0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
216f0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
21700 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  n = 1;.  }..  as
21710 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
21720 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
21730 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21740 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74  2, res) );.  ret
21750 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
21760 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21770 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
21780 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
21790 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
217a0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
217b0 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
217c0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
217d0 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
217e0 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
217f0 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
21800 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
21810 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
21820 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
21830 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
21840 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
21850 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
21860 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
21870 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
21880 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
21890 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
218a0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
218b0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
218c0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
218d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
218e0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
218f0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
21900 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
21910 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  ey1 = (const u8*
21920 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65  )pKey1;.  int se
21930 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74  rial_type;.  int
21940 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   res;..  assert(
21950 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21960 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  .flags & MEM_Str
21970 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74   );.  vdbeAssert
21980 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
21990 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
219a0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
219b0 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72  yInfo);.  getVar
219c0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
219d0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
219e0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
219f0 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  <12 ){.    res =
21a00 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20   pPKey2->r1;    
21a10 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
21a20 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  1) is a number o
21a30 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65  r a null */.  }e
21a40 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
21a50 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
21a60 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65   .    res = pPKe
21a70 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20  y2->r2;      /* 
21a80 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
21a90 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c   a blob */.  }el
21aa0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70  se{.    int nCmp
21ab0 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a  ;.    int nStr;.
21ac0 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20      int szHdr = 
21ad0 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e  aKey1[0];..    n
21ae0 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
21af0 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20  pe-12) / 2;.    
21b00 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74  if( (szHdr + nSt
21b10 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20  r) > nKey1 ){.  
21b20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
21b30 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
21b40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21b50 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
21b60 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
21b70 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d  */.    }.    nCm
21b80 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
21b90 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
21ba0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
21bb0 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
21bc0 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
21bd0 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
21be0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
21bf0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
21c00 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
21c10 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
21c20 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
21c30 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
21c40 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
21c50 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
21c60 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21c70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
21c80 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21c90 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
21ca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
21cb0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
21cc0 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
21cd0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
21ce0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
21cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21d00 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
21d10 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21d20 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
21d30 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
21d40 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
21d50 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
21d60 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
21d70 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
21d80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21d90 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21da0 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  >r1;.    }.  }..
21db0 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
21dc0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
21dd0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21de0 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20  PKey2, res).    
21df0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
21e00 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
21e10 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
21e20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
21e30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
21e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21e50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
21e60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21e70 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70  rdCompare() comp
21e80 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a  atible function.
21e90 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
21ea0 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c  comparing serial
21eb0 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20  ized records to 
21ec0 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  the unpacked rec
21ed0 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ord passed.** as
21ee0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
21ef0 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d  nt..*/.RecordCom
21f00 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65  pare sqlite3Vdbe
21f10 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61  FindCompare(Unpa
21f20 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
21f30 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72    /* varintRecor
21f40 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
21f50 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  d varintRecordCo
21f60 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f  mpareString() bo
21f70 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74  th assume.  ** t
21f80 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
21f90 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68  header varint th
21fa0 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
21fb0 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72   start of each r
21fc0 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20  ecord.  ** fits 
21fd0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
21fe0 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72   (i.e. is 127 or
21ff0 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65   less). varintRe
22000 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
22010 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d  .  ** also assum
22020 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
22030 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61  fe to overread a
22040 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65   buffer by at le
22050 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61  ast the .  ** ma
22060 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c  ximum possible l
22070 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  egal header size
22080 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42   plus 8 bytes. B
22090 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a  ecause there is.
220a0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
220b0 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37  to be at least 7
220c0 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20  4 (but not 136) 
220d0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
220e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a   following each.
220f0 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73    ** buffer pass
22100 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f  ed to varintReco
22110 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74  rdCompareInt() t
22120 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e  his makes it con
22130 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  venient to.  ** 
22140 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
22150 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20  f the header to 
22160 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  64 bytes in case
22170 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  s where the firs
22180 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20  t field.  ** is 
22190 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  an integer..  **
221a0 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73  .  ** The easies
221b0 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65  t way to enforce
221c0 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74   this limit is t
221d0 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20  o consider only 
221e0 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a  records with.  *
221f0 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c  * 13 fields or l
22200 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ess. If the firs
22210 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e  t field is an in
22220 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d  teger, the maxim
22230 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65  um legal.  ** he
22240 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32  ader size is (12
22250 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65  *5 + 1 + 1) byte
22260 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  s.  */.  if( p->
22270 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
22280 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69  eld<=13 ){.    i
22290 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d  nt flags = p->aM
222a0 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20  em[0].flags;.   
222b0 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
222c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
222d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  ){.      p->r1 =
222e0 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
222f0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
22300 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
22310 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
22320 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
22330 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
22340 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
22350 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
22360 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
22370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
22380 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
22390 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
223a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
223b0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
223c0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
223d0 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
223e0 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
223f0 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c  |MEM_Null|MEM_Bl
22400 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b  ob))==0 && p->pK
22410 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
22420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
22430 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ert( flags & MEM
22440 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  _Str );.      re
22450 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
22460 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20  ompareString;.  
22470 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
22480 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
22490 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  ordCompare;.}../
224a0 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
224b0 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
224c0 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
224d0 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
224e0 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
224f0 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
22500 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
22510 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
22520 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
22530 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
22540 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
22550 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
22560 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
22570 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
22580 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
22590 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
225a0 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
225b0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
225c0 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
225d0 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
225e0 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
225f0 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
22600 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
22610 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
22620 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
22630 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
22640 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
22650 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
22660 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
22670 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
22680 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
22690 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
226a0 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
226b0 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
226c0 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
226d0 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
226e0 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
226f0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
22700 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f    Mem m, v;..  /
22710 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
22720 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
22730 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
22740 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
22750 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
22760 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
22770 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
22780 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
22790 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
227a0 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
227b0 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
227c0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
227d0 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
227e0 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
227f0 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
22800 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
22810 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
22820 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
22830 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
22840 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
22850 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73  ;.  nCellKey = s
22860 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
22870 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
22880 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
22890 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
228a0 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
228b0 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
228c0 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
228d0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
228e0 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
228f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
22900 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
22910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
22920 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
22930 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
22940 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66  llKey, &m);.  if
22950 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
22960 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
22970 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   The index entry
22980 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68   must begin with
22990 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a   a header size *
229a0 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
229b0 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
229c0 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61  szHdr);.  testca
229d0 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a  se( szHdr==3 );.
229e0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
229f0 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20  r==m.n );.  if( 
22a00 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33  unlikely(szHdr<3
22a10 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d   || (int)szHdr>m
22a20 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
22a30 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
22a40 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
22a50 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
22a60 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
22a70 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
22a80 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
22a90 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
22aa0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
22ab0 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
22ac0 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
22ad0 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
22ae0 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
22af0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
22b00 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22b10 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
22b20 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
22b30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22b40 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
22b50 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22b60 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
22b70 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22b80 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
22b90 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
22ba0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22bb0 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
22bc0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22bd0 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
22be0 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
22bf0 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
22c00 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
22c10 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
22c20 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
22c30 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
22c40 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
22c50 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74  SmallTypeSizes[t
22c60 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73  ypeRowid];.  tes
22c70 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
22c80 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
22c90 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
22ca0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
22cb0 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
22cc0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
22cd0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
22ce0 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
22cf0 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
22d00 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
22d10 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
22d20 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
22d30 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
22d40 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
22d50 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
22d60 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
22d70 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
22d80 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
22d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
22da0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
22db0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
22dc0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
22dd0 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
22de0 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
22df0 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
22e00 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
22e10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
22e20 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
22e30 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
22e40 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
22e50 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
22e60 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
22e70 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
22e80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
22ea0 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
22eb0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
22ec0 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
22ed0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
22ee0 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
22ef0 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
22f00 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
22f10 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
22f20 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
22f30 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
22f40 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
22f50 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
22f60 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
22f70 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
22f80 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
22f90 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
22fa0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
22fb0 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
22fc0 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
22fd0 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
22fe0 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
22ff0 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
23000 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
23010 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
23020 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
23030 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
23040 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
23050 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
23060 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
23070 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
23080 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
23090 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
230a0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
230b0 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
230c0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
230d0 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
230e0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23100 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
23110 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
23120 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
23130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23140 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
23150 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
23160 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
23170 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
23180 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
23190 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
231a0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231c0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
231d0 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
231e0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
231f0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
23200 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
23210 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d  ursor *pCur;.  M
23220 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
23230 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
23240 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
23250 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e    pCur = pC->uc.
23260 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
23270 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
23280 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
23290 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
232a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
232b0 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
232c0 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  ;.  /* nCellKey 
232d0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
232e0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
232f0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
23300 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
23310 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
23320 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
23330 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
23340 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
23350 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
23360 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
23370 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
23380 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
23390 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
233a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
233b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
233c0 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
233d0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
233e0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
233f0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
23400 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
23410 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23430 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
23440 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
23450 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
23460 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
23470 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
23480 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
23490 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
234a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
234b0 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
234c0 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
234d0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
234e0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
234f0 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
23500 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
23510 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
23520 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
23530 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
23540 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
23550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23560 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
23570 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
23580 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
23590 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
235a0 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
235b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
235c0 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
235d0 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
235e0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
235f0 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
23600 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
23610 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23620 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
23630 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
23640 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
23650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
23660 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
23670 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
23680 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
23690 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
236a0 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
236b0 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
236c0 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
236d0 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
236e0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
236f0 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
23700 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
23710 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
23720 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
23730 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
23740 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
23750 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
23760 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
23770 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
23780 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
23790 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
237a0 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
237b0 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
237c0 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
237d0 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
237e0 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
237f0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
23800 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
23810 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
23820 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
23830 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
23840 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
23850 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
23860 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
23870 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
23880 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
23890 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
238a0 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
238b0 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
238c0 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
238d0 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
238e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
238f0 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20   SQLITE_PREPARE 
23900 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64 62 65  flags for a Vdbe
23910 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56  ..*/.u8 sqlite3V
23920 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28  dbePrepareFlags(
23930 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
23940 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b  rn v->prepFlags;
23950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23960 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
23970 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
23980 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
23990 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
239a0 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
239b0 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
239c0 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
239d0 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
239e0 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
239f0 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
23a00 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
23a10 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
23a20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
23a30 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
23a40 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
23a50 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
23a60 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
23a70 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
23a80 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
23a90 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
23aa0 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
23ab0 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
23ac0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
23ad0 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
23ae0 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
23af0 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
23b00 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
23b10 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
23b20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
23b30 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
23b40 20 20 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e      assert( (v->
23b50 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
23b60 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d  TE_EnableQPSG)==
23b70 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
23b80 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
23b90 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
23ba0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
23bb0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
23bc0 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
23bd0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
23be0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23bf0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
23c00 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
23c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23c20 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
23c30 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
23c40 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
23c50 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
23c60 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
23c70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23c80 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
23c90 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
23ca0 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
23cb0 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
23cc0 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
23cd0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
23ce0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
23cf0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
23d00 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
23d10 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
23d20 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
23d30 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
23d40 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
23d50 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
23d60 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
23d70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d  );.  assert( (v-
23d80 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
23d90 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d  ITE_EnableQPSG)=
23da0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  =0 );.  if( iVar
23db0 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  >=32 ){.    v->e
23dc0 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30  xpmask |= 0x8000
23dd0 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  0000;.  }else{. 
23de0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
23df0 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
23e00 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  r-1));.  }.}../*
23e10 0a 2a 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63  .** Cause a func
23e20 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e  tion to throw an
23e30 20 65 72 72 6f 72 20 69 66 20 69 74 20 77 61 73   error if it was
23e40 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75   call from OP_Pu
23e50 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72  reFunc.** rather
23e60 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f   than OP_Functio
23e70 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65  n..**.** OP_Pure
23e80 46 75 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20  Func means that 
23e90 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  the function mus
23ea0 74 20 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74  t be determinist
23eb0 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ic, and should.*
23ec0 2a 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * throw an error
23ed0 20 69 66 20 69 74 20 69 73 20 67 69 76 65 6e 20   if it is given 
23ee0 69 6e 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c  inputs that woul
23ef0 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65  d make it non-de
23f00 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20  terministic..** 
23f10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
23f20 69 6e 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f  invoked by date/
23f30 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  time functions t
23f40 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65  hat use non-dete
23f50 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61  rministic.** fea
23f60 74 75 72 65 73 20 73 75 63 68 20 61 73 20 27 6e  tures such as 'n
23f70 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ow'..*/.int sqli
23f80 74 65 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73  te3NotPureFunc(s
23f90 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
23fa0 70 43 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51  pCtx){.#ifdef SQ
23fb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
23fc0 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
23fd0 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20   pCtx->pVdbe==0 
23fe0 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64  ) return 1;.#end
23ff0 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70  if.  if( pCtx->p
24000 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e  Vdbe->aOp[pCtx->
24010 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  iOp].opcode==OP_
24020 50 75 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20  PureFunc ){.    
24030 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
24040 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
24050 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e     "non-determin
24060 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69  istic function i
24070 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  n index expressi
24080 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73  on or CHECK cons
24090 74 72 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20  traint",.       
240a0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
240b0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
240c0 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
240d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
240e0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
240f0 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
24100 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
24110 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
24120 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
24130 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
24140 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
24150 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
24160 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
24170 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
24180 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
24190 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
241a0 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
241b0 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
241c0 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
241d0 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
241e0 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28  b *pVtab){.  if(
241f0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
24200 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
24210 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
24220 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24230 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
24240 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
24250 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
24260 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
24270 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
24280 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
24290 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62  rMsg);.    pVtab
242a0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
242b0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
242c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
242d0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64  ALTABLE */..#ifd
242e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
242f0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
24300 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  ./*.** If the se
24310 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
24320 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61   not NULL, relea
24330 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f  se any allocatio
24340 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  ns associated .*
24350 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72  * with the memor
24360 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  y cells in the p
24370 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20  ->aMem[] array. 
24380 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e  Also free the Un
24390 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
243a0 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
243b0 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  , using sqlite3D
243c0 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  bFree()..**.** T
243d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
243e0 75 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70  used to free Unp
243f0 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
24400 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64  ctures allocated
24410 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55   by.** the vdbeU
24420 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
24430 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20  nction found in 
24440 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74  vdbeapi.c..*/.st
24450 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
24460 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74  eeUnpacked(sqlit
24470 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65  e3 *db, int nFie
24480 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ld, UnpackedReco
24490 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
244a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
244b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69    for(i=0; i<nFi
244c0 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
244d0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
244e0 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  >aMem[i];.      
244f0 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  if( pMem->zMallo
24500 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
24510 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
24520 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24530 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
24540 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
24550 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
24560 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
24570 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
24580 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
24590 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e  TE_HOOK./*.** In
245a0 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
245b0 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69  ate hook. If thi
245c0 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
245d0 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64  r DELETE pre-upd
245e0 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65  ate call,.** the
245f0 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  n cursor passed 
24600 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
24610 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f  gument should po
24620 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61  int to the row a
24630 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70  bout.** to be up
24640 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e  date or deleted.
24650 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
24660 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
24670 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
24680 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72  ),.** the requir
24690 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ed value will be
246a0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
246b0 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ow the cursor po
246c0 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64  ints to..*/.void
246d0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
246e0 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62  pdateHook(.  Vdb
246f0 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24710 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20  Vdbe pre-update 
24720 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
24730 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  by */.  VdbeCurs
24740 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
24750 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
24760 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20  r to grab old.* 
24770 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20  values from */. 
24780 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52   /* SQLITE_INSER
247b0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
247c0 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ETE */.  const c
247d0 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
247e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
247f0 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54  base name */.  T
24800 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24820 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  * Modified table
24830 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c   */.  i64 iKey1,
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
24860 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20   key value */.  
24870 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
248a0 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a  new.* record */.
248b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
248c0 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20   = v->db;.  i64 
248d0 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61  iKey2;.  PreUpda
248e0 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20  te preupdate;.  
248f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
24900 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
24910 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
24920 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20  8 fakeSortOrder 
24930 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
24940 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d  db->pPreUpdate==
24950 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
24960 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a  reupdate, 0, siz
24970 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b  eof(PreUpdate));
24980 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
24990 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pTab)==0 ){.    
249a0 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20  iKey1 = iKey2 = 
249b0 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61 74 65  0;.    preupdate
249c0 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  .pPk = sqlite3Pr
249d0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
249e0 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
249f0 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
24a00 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
24a10 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
24a20 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20  [iReg].u.i;.    
24a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65  }else{.      iKe
24a40 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20  y2 = iKey1;.    
24a50 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
24a60 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70   pCsr->nField==p
24a70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20  Tab->nCol .     
24a80 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65    || (pCsr->nFie
24a90 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  ld==pTab->nCol+1
24aa0 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   && op==SQLITE_D
24ab0 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d  ELETE && iReg==-
24ac0 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70  1).  );..  preup
24ad0 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72  date.v = v;.  pr
24ae0 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70  eupdate.pCsr = p
24af0 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Csr;.  preupdate
24b00 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75  .op = op;.  preu
24b10 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20  pdate.iNewReg = 
24b20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74  iReg;.  preupdat
24b30 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64  e.keyinfo.db = d
24b40 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  b;.  preupdate.k
24b50 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43  eyinfo.enc = ENC
24b60 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74  (db);.  preupdat
24b70 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
24b80 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  eld = pTab->nCol
24b90 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
24ba0 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yinfo.aSortOrder
24bb0 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72   = (u8*)&fakeSor
24bc0 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64  tOrder;.  preupd
24bd0 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79  ate.iKey1 = iKey
24be0 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  1;.  preupdate.i
24bf0 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20  Key2 = iKey2;.  
24c00 70 72 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d  preupdate.pTab =
24c10 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50   pTab;..  db->pP
24c20 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75  reUpdate = &preu
24c30 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72  pdate;.  db->xPr
24c40 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  eUpdateCallback(
24c50 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
24c60 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20  g, db, op, zDb, 
24c70 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65  zTbl, iKey1, iKe
24c80 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  y2);.  db->pPreU
24c90 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pdate = 0;.  sql
24ca0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
24cb0 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64  reupdate.aRecord
24cc0 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
24cd0 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
24ce0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79  ate.keyinfo.nKey
24cf0 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61  Field+1, preupda
24d00 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
24d10 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
24d20 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
24d30 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
24d40 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70  d+1, preupdate.p
24d50 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
24d60 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
24d70 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
24d80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24d90 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
24da0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
24db0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
24dc0 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
24dd0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
24de0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
24df0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  b, preupdate.aNe
24e00 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  w);.  }.}.#endif
24e10 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
24e20 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
24e30 20 2a 2f 0a                                       */.