/ Hex Artifact Content
Login

Artifact c423065d50cee24bc8cba57764f5e9869a1bb920c50907f5dd363ebd7c5aef82:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70   pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42  A->expmask;.  pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41  ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d  ->prepFlags;.  m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74  emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72  er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f  , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61  unter));.  pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f  ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20  es not grow too 
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e  large */.  if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69  New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20  _VDBE_OP] ){.   
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  (p->db);.    ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15b0: 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20    int jj, kk;.  
15c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
15d0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  = p->pParse;.   
15e0: 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a   for(jj=kk=0; jj
15f0: 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
1600: 68 65 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  he; jj++){.     
1610: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
1620: 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61  e *x = pParse->a
1630: 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20  ColCache + jj;. 
1640: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b       printf(" r[
1650: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d  %d]={%d:%d}", x-
1660: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65  >iReg, x->iTable
1670: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  , x->iColumn);. 
1680: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d       kk++;.    }
1690: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72  .    if( kk ) pr
16a0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
16b0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
16c0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
16d0: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61  [i]);.    test_a
16e0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
16f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
1700: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
1710: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
1720: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
1730: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1740: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1750: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69  OVERAGE.  pOp->i
1760: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e  SrcLine = 0;.#en
1770: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1780: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1790: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
17a0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
17b0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
17c0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
17d0: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
17e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
17f0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1800: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1820: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1830: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1840: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1850: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1860: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1870: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1880: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1890: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
18a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18b0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74   for an uncondit
18c0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e  ional jump to in
18d0: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a  struction iDest.
18e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
18f0: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20  beGoto(Vdbe *p, 
1900: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65  int iDest){.  re
1910: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1920: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74  AddOp3(p, OP_Got
1930: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b  o, 0, iDest, 0);
1940: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1950: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68  code to cause th
1960: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f  e string zStr to
1970: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a   be loaded into.
1980: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73  ** register iDes
1990: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
19a0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56  VdbeLoadString(V
19b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
19c0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
19d0: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Str){.  return s
19e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19f0: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (p, OP_String8, 
1a00: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74  0, iDest, 0, zSt
1a10: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
1a20: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1a30: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d  at initializes m
1a40: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72  ultiple register
1a50: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69  s to string or i
1a60: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61  nteger.** consta
1a70: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74  nts.  The regist
1a80: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69  ers begin with i
1a90: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73  Dest and increas
1aa0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e  e consecutively.
1ab0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72  .** One register
1ac0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1ad0: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67  for each characg
1ae0: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e  ter in zTypes[].
1af0: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73    For each.** "s
1b00: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a  " character in z
1b10: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1b20: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e  ister is a strin
1b30: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  g if the argumen
1b40: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c  t is.** not NULL
1b50: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20  , or OP_Null if 
1b60: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
1b70: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f  ull pointer.  Fo
1b80: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61  r each "i" chara
1b90: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  cter.** in zType
1ba0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65  s[], the registe
1bb0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1bc0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   to an integer..
1bd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  **.** If the inp
1be0: 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e  ut string does n
1bf0: 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58 22 20  ot end with "X" 
1c00: 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c  then an OP_Resul
1c10: 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e  tRow instruction
1c20: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64  .** is generated
1c30: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20   for the values 
1c40: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69  inserted..*/.voi
1c50: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c  d sqlite3VdbeMul
1c60: 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20  tiLoad(Vdbe *p, 
1c70: 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74  int iDest, const
1c80: 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e   char *zTypes, .
1c90: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1ca0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
1cb0: 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  ar c;.  va_start
1cc0: 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20  (ap, zTypes);.  
1cd0: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54  for(i=0; (c = zT
1ce0: 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  ypes[i])!=0; i++
1cf0: 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73  ){.    if( c=='s
1d00: 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ' ){.      const
1d10: 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72   char *z = va_ar
1d20: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1d30: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
1d40: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a  3VdbeAddOp4(p, z
1d50: 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20  ==0 ? OP_Null : 
1d60: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69  OP_String8, 0, i
1d70: 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29  Dest+i, 0, z, 0)
1d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1d90: 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20  c=='i' ){.      
1da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db0: 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(p, OP_Integer,
1dc0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1dd0: 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20  , iDest+i);.    
1de0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
1df0: 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74  o skip_op_result
1e00: 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  row;.    }.  }. 
1e10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e20: 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(p, OP_ResultR
1e30: 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73  ow, iDest, i);.s
1e40: 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77  kip_op_resultrow
1e50: 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  :.  va_end(ap);.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1e70: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1e80: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1e90: 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a  e as a pointer..
1ea0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1eb0: 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65  beAddOp4(.  Vdbe
1ec0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1ed0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
1ee0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
1ef0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
1f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1f10: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
1f20: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
1f30: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
1f40: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f60: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
1f70: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
1f80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
1f90: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
1fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20  nst char *zP4,  
1fb0: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
1fc0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74  and */.  int p4t
1fd0: 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ype          /* 
1fe0: 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20  P4 operand type 
1ff0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
2000: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2010: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
2020: 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74  p2, p3);.  sqlit
2030: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
2040: 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74  , addr, zP4, p4t
2050: 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ype);.  return a
2060: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ddr;.}../*.** Ad
2070: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
2080: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
2090: 20 76 61 6c 75 65 20 77 69 74 68 20 61 20 50 34   value with a P4
20a0: 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f  _INT64 or.** P4_
20b0: 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e  REAL type..*/.in
20c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
20d0: 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62 65 20  Op4Dup8(.  Vdbe 
20e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
20f0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
2100: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
2110: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2120: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2130: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
2140: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
2150: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
2160: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2180: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
2190: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
21a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
21b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
21c0: 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20  st u8 *zP4,     
21d0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
21e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79  nd */.  int p4ty
21f0: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  pe          /* P
2200: 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a  4 operand type *
2210: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63  /.){.  char *p4c
2220: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  opy = sqlite3DbM
2230: 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74  allocRawNN(sqlit
2240: 65 33 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b  e3VdbeDb(p), 8);
2250: 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20 29 20  .  if( p4copy ) 
2260: 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a  memcpy(p4copy, z
2270: 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e  P4, 8);.  return
2280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2290: 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p4(p, op, p1, p2
22a0: 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34  , p3, p4copy, p4
22b0: 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  type);.}../*.** 
22c0: 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53  Add an OP_ParseS
22d0: 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54  chema opcode.  T
22e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62  his routine is b
22f0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a  roken out from.*
2300: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
2310: 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e  Op4() since it n
2320: 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65  eeds to also nee
2330: 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62  ds to mark all b
2340: 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69  trees.** as havi
2350: 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a  ng been used..**
2360: 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73  .** The zWhere s
2370: 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20  tring must have 
2380: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
2390: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
23a0: 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  c()..** This rou
23b0: 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f  tine will take o
23c0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
23d0: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
23e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23f0: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
2400: 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  emaOp(Vdbe *p, i
2410: 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57  nt iDb, char *zW
2420: 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a  here){.  int j;.
2430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2440: 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op4(p, OP_ParseS
2450: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
2460: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
2470: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
2480: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
2490: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
24a0: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
24b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
24c0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
24d0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
24e0: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
24f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2500: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
2510: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
2520: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
2530: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
2540: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
2550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2560: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
2570: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
2580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
2590: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
25a0: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
25b0: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
25c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25e0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
25f0: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
2600: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
2610: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
2620: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
2630: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
2640: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
2650: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
2660: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
2670: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
2680: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
2690: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
26a0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
26b0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20   = P4_INT32;.   
26c0: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b   pOp->p4.i = p4;
26d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
26e0: 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74  dr;.}../* Insert
26f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f   the end of a co
2700: 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64  -routine.*/.void
2710: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2720: 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76  oroutine(Vdbe *v
2730: 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b  , int regYield){
2740: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2750: 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
2760: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
2770: 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20  d);..  /* Clear 
2780: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  the temporary re
2790: 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68  gister cache, th
27a0: 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74  ereby ensuring t
27b0: 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f  hat each.  ** co
27c0: 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73  -routine has its
27d0: 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74   own independent
27e0: 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72   set of register
27f0: 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f  s, because co-ro
2800: 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68  utines.  ** migh
2810: 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72  t expect their r
2820: 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70  egisters to be p
2830: 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20  reserved across 
2840: 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64  an OP_Yield, and
2850: 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64  .  ** that could
2860: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20   cause problems 
2870: 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
2880: 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  o-routines are u
2890: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
28a0: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ** temporary reg
28b0: 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d  ister..  */.  v-
28c0: 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  >pParse->nTempRe
28d0: 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72  g = 0;.  v->pPar
28e0: 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
28f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2900: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
2910: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
2920: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
2930: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
2940: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
2950: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
2960: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
2970: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
2980: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
2990: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
29a0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
29b0: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
29c0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
29d0: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
29e0: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
29f0: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
2a00: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
2a10: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
2a20: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
2a30: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
2a40: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
2a50: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
2a60: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
2a70: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
2a80: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
2a90: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
2aa0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
2ab0: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
2ac0: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
2ad0: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
2ae0: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
2af0: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
2b00: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
2b10: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
2b20: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
2b30: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
2b40: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
2b50: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
2b60: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
2b70: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
2b80: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  akeLabel(Vdbe *v
2b90: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  ){.  Parse *p = 
2ba0: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  v->pParse;.  int
2bb0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
2bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d  ;.  assert( v->m
2bd0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2be0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28  _INIT );.  if( (
2bf0: 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b  i & (i-1))==0 ){
2c00: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  .    p->aLabel =
2c10: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
2c20: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
2c30: 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20  ->aLabel, .     
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66    (i*2+1)*sizeof
2c70: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b  (p->aLabel[0]));
2c80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c  .  }.  if( p->aL
2c90: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
2ca0: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20  Label[i] = -1;. 
2cb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52   }.  return ADDR
2cc0: 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (i);.}../*.** Re
2cd0: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
2ce0: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
2cf0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2d00: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
2d10: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
2d20: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
2d30: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
2d40: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2d50: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
2d60: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2d70: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
2d80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2d90: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
2da0: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
2db0: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2dc0: 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28  .  int j = ADDR(
2dd0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  x);.  assert( v-
2de0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2df0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
2e00: 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  ert( j<p->nLabel
2e10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
2e20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
2e30: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
2e40: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
2e50: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
2e60: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
2e70: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
2e80: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
2e90: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
2ea0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
2eb0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
2ec0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
2ed0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
2ee0: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
2ef0: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
2f00: 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20  be run multiple 
2f10: 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  times..*/.void s
2f20: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
2f30: 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  le(Vdbe *p){.  p
2f40: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
2f50: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
2f60: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
2f70: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
2f80: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
2f90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2fa0: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
2fb0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
2fc0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2fd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
2fe0: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
2ff0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
3000: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
3010: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
3020: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
3030: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
3040: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
3050: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
3060: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
3070: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
3080: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
3090: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
30a0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
30b0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
30c0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
30f0: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
3100: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3110: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3120: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
3130: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
3140: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
3150: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3160: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
3170: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
3180: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
3190: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
31a0: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
31b0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
31c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31d0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
31e0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
31f0: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
3200: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
3210: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
3220: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
3230: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
3240: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
3250: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3260: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
3270: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
3280: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3290: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
32a0: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
32b0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
32c0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e0: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
32f0: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
3300: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
3310: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
3320: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
3330: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
3340: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
3350: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
3360: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
3370: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
3380: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
3390: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
33a0: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
33b0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
33c0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
33d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
33e0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
33f0: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
3400: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
3410: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
3420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3430: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
3440: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
3450: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
3460: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
3470: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
3480: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
3490: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
34a0: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
34b0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
34c0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
34d0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
34e0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
34f0: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
3500: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
3510: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
3520: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3530: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
3540: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
3550: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
3560: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
3570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3580: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
3590: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
35a0: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
35b0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
35c0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
35d0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
35e0: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
35f0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
3600: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
3610: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
3620: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
3630: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
3640: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
3650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3660: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
3670: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
3680: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
3690: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
36a0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
36b0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
36c0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
36d0: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
36e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
36f0: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
3700: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
3710: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
3720: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
3730: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
3740: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
3750: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
3760: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
3770: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
3780: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
3790: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
37a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
37b0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
37c0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
37d0: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
37e0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
37f0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
3800: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
3810: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
3820: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
3830: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
3840: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
3850: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
3860: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
3870: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20  constraint).**  
3880: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72   *  OP_CreateBtr
3890: 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  ee/BTREE_INTKEY 
38a0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
38b0: 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66  tine .**      (f
38c0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
38d0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
38e0: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
38f0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
3900: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3910: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3920: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3930: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3940: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3950: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3960: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3970: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3980: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3990: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
39a0: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
39b0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
39c0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
39d0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
39e0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
39f0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
3a00: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3a10: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3a20: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3a30: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3a40: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3a50: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3a60: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3a70: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3a80: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3a90: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3aa0: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
3ab0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
3ac0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
3ad0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
3ae0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
3af0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3b00: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3b10: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3b20: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3b30: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3b40: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3b50: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3b60: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3b70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3b80: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3b90: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3ba0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
3bb0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
3bc0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
3bd0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
3be0: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
3bf0: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
3c00: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3c10: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
3c20: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
3c30: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
3c40: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
3c50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
3c60: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42  code==OP_CreateB
3c70: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d  tree && pOp->p3=
3c80: 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20  =BTREE_INTKEY ) 
3c90: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
3ca0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
3cb0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
3cc0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
3cd0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
3ce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3cf0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3d10: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
3d20: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
3d30: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
3d40: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
3d50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3d60: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
3d70: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
3d80: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
3d90: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
3da0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
3db0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
3dc0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
3dd0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
3de0: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
3df0: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
3e00: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
3e10: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
3e20: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3e30: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3e40: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3e50: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3e60: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3e70: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3e80: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3e90: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3ea0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
3eb0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
3ec0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
3ed0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
3ee0: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
3ef0: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3f10: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
3f20: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
3f30: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
3f40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3f50: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3f60: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3f70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3f80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3f90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
3fa0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
3fb0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
3fc0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
3fd0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
3fe0: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
3ff0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
4000: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
4010: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
4020: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
4030: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
4040: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
4050: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
4060: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
4070: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
4080: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
4090: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
40a0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
40b0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
40c0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
40d0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
40e0: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
40f0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
4100: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
4110: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
4120: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
4130: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
4140: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
4150: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
4160: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
4170: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
4180: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
4190: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
41a0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
41b0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
41c0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
41d0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
41e0: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
41f0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
4200: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
4210: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
4220: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
4230: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
4240: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
4250: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
4260: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
4270: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
4280: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
4290: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
42a0: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
42b0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
42c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
42d0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
42e0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
42f0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
4300: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
4310: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
4320: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
4330: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
4340: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
4350: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
4360: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
4370: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
4380: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
4390: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
43a0: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
43b0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
43c0: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
43d0: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
43e0: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
43f0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
4400: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
4410: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
4420: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
4430: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
4440: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
4450: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
4460: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
4470: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
4480: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
4490: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
44a0: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
44b0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
44c0: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
44d0: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
44e0: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
44f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
4500: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
4510: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
4520: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
4530: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
4540: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
4550: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
4560: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
4570: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
4580: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
4590: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
45a0: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
45b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
45c0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
45d0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
45e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
45f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4600: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
4610: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
4620: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
4630: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
4640: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
4650: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
4660: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
4670: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
4680: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
4690: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
46a0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
46b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
46c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
46d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
46e0: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
46f0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
4700: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
4710: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
4720: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4730: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
4740: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
4750: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
4760: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
4770: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
4780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4790: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
47a0: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
47b0: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f   case OP_NextIfO
47c0: 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 63 61 73  pen:.        cas
47d0: 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
47e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
47f0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
4800: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
4810: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
4820: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
4830: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ANCE;.          
4840: 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
4850: 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65  rator never code
4860: 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f  s any of these o
4870: 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70  pcodes as a jump
4880: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
4890: 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20   a label.  They 
48a0: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64  are always coded
48b0: 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77   as a jump backw
48c0: 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20  ards to a .     
48d0: 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64       ** known ad
48e0: 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20  dress */.       
48f0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
4900: 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  p2>=0 );.       
4910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4920: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
4930: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
4940: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
4950: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
4960: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
4970: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
4980: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20  ePrevious;.     
4990: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
49a0: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
49b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49c0: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e  code generator n
49d0: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f  ever codes any o
49e0: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  f these opcodes 
49f0: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20  as a jump.      
4a00: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65      ** to a labe
4a10: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77  l.  They are alw
4a20: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a  ays coded as a j
4a30: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f  ump backwards to
4a40: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   a .          **
4a50: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a   known address *
4a60: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
4a70: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
4a80: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4a90: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
4aa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4ab0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
4ac0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55        case OP_VU
4ad0: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
4ae0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
4af0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
4b00: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
4b10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4b20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b30: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
4b40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
4b50: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  t n;.          a
4b60: 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d  ssert( (pOp - p-
4b70: 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20  >aOp) >= 3 );.  
4b80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4b90: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
4ba0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
4bb0: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b          n = pOp[
4bc0: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20  -1].p1;.        
4bd0: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
4be0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61  .          /* Fa
4c00: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
4c10: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65  the default case
4c20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23 65   */.        }.#e
4c30: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66  ndif.        def
4c40: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
4c50: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20    if( pOp->p2<0 
4c60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
4c70: 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  * The mkopcodeh.
4c80: 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73  tcl script has s
4c90: 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67  o arranged thing
4ca0: 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a  s that the only.
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
4cc0: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20  on-jump opcodes 
4cd0: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45  less than SQLITE
4ce0: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72  _MX_JUMP_CODE ar
4cf0: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  e guaranteed to.
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68              ** h
4d10: 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  ave non-negative
4d20: 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20   values for P2. 
4d30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
4d40: 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f  ssert( (sqlite3O
4d50: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4d60: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
4d70: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20  LG_JUMP)!=0 );. 
4d80: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
4d90: 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29  t( ADDR(pOp->p2)
4da0: 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20  <pParse->nLabel 
4db0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
4dc0: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
4dd0: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a  ADDR(pOp->p2)];.
4de0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4df0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4e10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70       /* The mkop
4e20: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74  codeh.tcl script
4e30: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64   has so arranged
4e40: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65   things that the
4e50: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e   only.      ** n
4e60: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20  on-jump opcodes 
4e70: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45  less than SQLITE
4e80: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72  _MX_JUMP_CODE ar
4e90: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  e guaranteed to.
4ea0: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f        ** have no
4eb0: 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  n-negative value
4ec0: 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20  s for P2. */.   
4ed0: 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69     assert( (sqli
4ee0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
4ef0: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f  y[pOp->opcode]&O
4f00: 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c  PFLG_JUMP)==0 ||
4f10: 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20   pOp->p2>=0);.  
4f20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d    }.    if( pOp=
4f30: 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b  =p->aOp ) break;
4f40: 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a  .    pOp--;.  }.
4f50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4f60: 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  p->db, pParse->a
4f70: 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65  Label);.  pParse
4f80: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  ->aLabel = 0;.  
4f90: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d  pParse->nLabel =
4fa0: 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41   0;.  *pMaxFuncA
4fb0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
4fc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
4fd0: 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d  Reader!=0 || DbM
4fe0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
4ff0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f  reeMask) );.}../
5000: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5010: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
5020: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
5030: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
5040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
5050: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
5060: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
5070: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5080: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5090: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
50a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  }../*.** Verify 
50b0: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20  that at least N 
50c0: 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65  opcode slots are
50d0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20   available in p 
50e0: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
50f0: 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20  g to malloc for 
5100: 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65  more space (exce
5110: 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  pt when compiled
5120: 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
5130: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
5140: 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74  RESS).  This int
5150: 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64  erface is used d
5160: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a  uring testing.**
5170: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
5180: 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f  certain calls to
5190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
51a0: 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65  pList() can neve
51b0: 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f  r.** fail due to
51c0: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64   a OOM fault and
51d0: 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20   hence that the 
51e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
51f0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
5200: 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c  AddOpList() will
5210: 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e   always be non-N
5220: 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ULL..*/.#if defi
5230: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
5240: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
5250: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
5260: 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73  C_STRESS).void s
5270: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
5280: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
5290: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29  (Vdbe *p, int N)
52a0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
52b0: 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61  Op + N <= p->pPa
52c0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b  rse->nOpAlloc );
52d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
52e0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
52f0: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68   VM passed as th
5300: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
5310: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5320: 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74  .** an OP_Result
5330: 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c  Row opcode. Fail
5340: 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20   an assert() if 
5350: 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73  it does. This is
5360: 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65   used.** by code
5370: 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20   in pragma.c to 
5380: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
5390: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
53a0: 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61  f certain.** pra
53b0: 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69  gmas comports wi
53c0: 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65  th the flags spe
53d0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b  cified in the mk
53e0: 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a  pragmatab.tcl.**
53f0: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20   script..*/.#if 
5400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5410: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
5420: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
5430: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
5440: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
5450: 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28  rifyNoResultRow(
5460: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
5470: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5480: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
5490: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
54a0: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52  [i].opcode!=OP_R
54b0: 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a  esultRow );.  }.
54c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
54d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
54e0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
54f0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
5500: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
5510: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
5520: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
5530: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5540: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
5550: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
5560: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
5570: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
5580: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
5590: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
55a0: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
55b0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
55c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
55d0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
55e0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
55f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
5600: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
5610: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
5620: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
5630: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
5640: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
5650: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
5660: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
5670: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
5680: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
5690: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
56a0: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
56b0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
56c0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
56d0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
56e0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
56f0: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
5700: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
5710: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
5720: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
5730: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
5740: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
5750: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
5760: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
5770: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
5780: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
5790: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
57a0: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
57b0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
57c0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
57d0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
57e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
57f0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
5800: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
5810: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
5820: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
5830: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
5840: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  ack.  Return a.*
5850: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
5860: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
5870: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
5880: 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67   Non-zero P2 arg
5890: 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69  uments to jump i
58a0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
58b0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64  automatically ad
58c0: 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61  justed.** so tha
58d0: 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65  t the jump targe
58e0: 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f  t is relative to
58f0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
5900: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
5910: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
5920: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a  3VdbeAddOpList(.
5930: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5950: 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f  * Add opcodes to
5960: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
5970: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
5980: 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   nOp,           
5990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
59a0: 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74  ber of opcodes t
59b0: 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f  o add */.  VdbeO
59c0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
59d0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
59e0: 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64  pcodes to be add
59f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  ed */.  int iLin
5a00: 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  eno             
5a10: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66       /* Source-f
5a20: 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ile line number 
5a30: 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20  of first opcode 
5a40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
5a50: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a   VdbeOp *pOut, *
5a60: 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74  pFirst;.  assert
5a70: 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ( nOp>0 );.  ass
5a80: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
5a90: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
5aa0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
5ab0: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
5ac0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
5ad0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
5ae0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
5af0: 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74 20  0;.  }.  pFirst 
5b00: 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70  = pOut = &p->aOp
5b10: 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28  [p->nOp];.  for(
5b20: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
5b30: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b   aOp++, pOut++){
5b40: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64  .    pOut->opcod
5b50: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = aOp->opcode;
5b60: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20  .    pOut->p1 = 
5b70: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75  aOp->p1;.    pOu
5b80: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b  t->p2 = aOp->p2;
5b90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70  .    assert( aOp
5ba0: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 69  ->p2>=0 );.    i
5bb0: 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  f( (sqlite3Opcod
5bc0: 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e 6f  eProperty[aOp->o
5bd0: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a  pcode] & OPFLG_J
5be0: 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d 3e  UMP)!=0 && aOp->
5bf0: 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 4f  p2>0 ){.      pO
5c00: 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70  ut->p2 += p->nOp
5c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  ;.    }.    pOut
5c20: 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a  ->p3 = aOp->p3;.
5c30: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
5c40: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
5c50: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
5c60: 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20  0;.    pOut->p5 
5c70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
5c80: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5c90: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70  N_COMMENTS.    p
5ca0: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  Out->zComment = 
5cb0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
5cc0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
5cd0: 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e  ERAGE.    pOut->
5ce0: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
5cf0: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
5d00: 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23  (void)iLineno;.#
5d10: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
5d20: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
5d30: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
5d40: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
5d50: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
5d60: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5d70: 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20  Op(0, i+p->nOp, 
5d80: 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70  &p->aOp[i+p->nOp
5d90: 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ]);.    }.#endif
5da0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d  .  }.  p->nOp +=
5db0: 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70   nOp;.  return p
5dc0: 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65  First;.}..#if de
5dd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
5de0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
5df0: 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  TUS)./*.** Add a
5e00: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 61  n entry to the a
5e10: 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72 73  rray of counters
5e20: 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c 69   managed by sqli
5e30: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
5e40: 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tus()..*/.void s
5e50: 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53 74  qlite3VdbeScanSt
5e60: 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70 2c  atus(.  Vdbe *p,
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f          /* VM to
5e90: 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28   add scanstatus(
5ea0: 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ) to */.  int ad
5eb0: 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20  drExplain,      
5ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
5ed0: 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61  ress of OP_Expla
5ee0: 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69  in (or 0) */.  i
5ef0: 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20  nt addrLoop,    
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f10: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f  * Address of loo
5f20: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20  p counter */ .  
5f30: 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20 20  int addrVisit,  
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 6f  /* Address of ro
5f60: 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e 74  ws visited count
5f70: 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  er */.  LogEst n
5f80: 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Est,            
5f90: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d          /* Estim
5fa0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
5fb0: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20  utput rows */.  
5fc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5fd0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
5fe0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
5ff0: 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20   or index being 
6000: 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20  scanned */.){.  
6010: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
6020: 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f  nScan+1) * sizeo
6030: 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20  f(ScanStatus);. 
6040: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65   ScanStatus *aNe
6050: 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61  w;.  aNew = (Sca
6060: 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33  nStatus*)sqlite3
6070: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
6080: 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65   p->aScan, nByte
6090: 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b  );.  if( aNew ){
60a0: 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75 73 20  .    ScanStatus 
60b0: 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d  *pNew = &aNew[p-
60c0: 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70  >nScan++];.    p
60d0: 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  New->addrExplain
60e0: 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a   = addrExplain;.
60f0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f      pNew->addrLo
6100: 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20  op = addrLoop;. 
6110: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73     pNew->addrVis
6120: 69 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a  it = addrVisit;.
6130: 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d      pNew->nEst =
6140: 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d   nEst;.    pNew-
6150: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
6160: 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20  DbStrDup(p->db, 
6170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61  zName);.    p->a
6180: 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  Scan = aNew;.  }
6190: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
61a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
61b0: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  ue of the opcode
61c0: 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c  , or P1, P2, P3,
61d0: 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a   or P5 operands.
61e0: 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  ** for a specifi
61f0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
6200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6210: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56  beChangeOpcode(V
6220: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
6230: 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29  , u8 iNewOpcode)
6240: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
6250: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70  etOp(p,addr)->op
6260: 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64  code = iNewOpcod
6270: 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  e;.}.void sqlite
6280: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64  3VdbeChangeP1(Vd
6290: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
62a0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
62b0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
62c0: 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b  addr)->p1 = val;
62d0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
62e0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
62f0: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
6300: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
6310: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
6320: 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d  dr)->p2 = val;.}
6330: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6340: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
6350: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
6360: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
6370: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
6380: 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p3 = val;.}.v
6390: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
63a0: 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c  hangeP5(Vdbe *p,
63b0: 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73 73 65   u16 p5){.  asse
63c0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
63d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
63e0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
63f0: 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70 5b 70  nOp>0 ) p->aOp[p
6400: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35  ->nOp-1].p5 = p5
6410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
6420: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
6430: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
6440: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
6450: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
6460: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
6470: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
6480: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
6490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
64a0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
64b0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
64c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
64d0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
64e0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
64f0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
6500: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
6510: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
6520: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
6530: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
6540: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
6550: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
6560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6570: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
6580: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
6590: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
65a0: 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66  {.  if( (pDef->f
65b0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
65c0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
65d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
65e0: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44 65 66  bFreeNN(db, pDef
65f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
6600: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
6610: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
6620: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
6630: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
6640: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
6650: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ry..*/.static SQ
6660: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
6670: 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73 71 6c  id freeP4Mem(sql
6680: 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70  ite3 *db, Mem *p
6690: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61  ){.  if( p->szMa
66a0: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
66b0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
66c0: 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  loc);.  sqlite3D
66d0: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
66e0: 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  }.static SQLITE_
66f0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
6700: 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c 69  eeP4FuncCtx(sqli
6710: 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33  te3 *db, sqlite3
6720: 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20  _context *p){.  
6730: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
6740: 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75  ction(db, p->pFu
6750: 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44 62 46  nc);. sqlite3DbF
6760: 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  reeNN(db, p);.}.
6770: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
6780: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
6790: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
67a0: 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28   *p4){.  assert(
67b0: 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28   db );.  switch(
67c0: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63   p4type ){.    c
67d0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
67e0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 46 75  {.      freeP4Fu
67f0: 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74  ncCtx(db, (sqlit
6800: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b  e3_context*)p4);
6810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6820: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6830: 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50  REAL:.    case P
6840: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73  4_INT64:.    cas
6850: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
6860: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6870: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6880: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
6890: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
68a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
68b0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
68c0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
68d0: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
68e0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
68f0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
6900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6910: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
6920: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
6930: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
6940: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
6950: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6960: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
6970: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6980: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
6990: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
69a0: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
69b0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
69c0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
69d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
69e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
69f0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
6a00: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
6a10: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
6a20: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
6a30: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
6a40: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
6a50: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
6a60: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
6a70: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
6a80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6a90: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
6aa0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
6ab0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
6ac0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
6ad0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
6ae0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
6af0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
6b00: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
6b10: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
6b20: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
6b30: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
6b40: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
6b50: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
6b60: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
6b70: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
6b80: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
6b90: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
6ba0: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
6bb0: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
6bc0: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
6bd0: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
6be0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
6bf0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
6c00: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
6c10: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
6c20: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
6c30: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
6c40: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
6c50: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
6c60: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
6c70: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
6c80: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
6c90: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
6ca0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6cb0: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
6cc0: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
6cd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6ce0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
6cf0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
6d00: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
6d10: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
6d20: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6d30: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
6d40: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
6d50: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
6d60: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
6d70: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
6d80: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
6d90: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
6da0: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
6db0: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
6dc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6dd0: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
6de0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
6df0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
6e00: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
6e10: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
6e20: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
6e30: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
6e40: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
6e50: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
6e60: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
6e70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
6e80: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
6e90: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
6ea0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
6eb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6ec0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
6ed0: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
6ee0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
6ef0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
6f00: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
6f10: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
6f20: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
6f30: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
6f40: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
6f50: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
6f60: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6f70: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
6f80: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
6f90: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
6fa0: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
6fb0: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
6fc0: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
6fd0: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
6fe0: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
6ff0: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
7000: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
7010: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7020: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
7030: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
7040: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
7050: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
7060: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
7070: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
7080: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7090: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
70a0: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
70b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
70c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
70d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
70e0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
70f0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
7100: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
7110: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
7120: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
7130: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
7140: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
7150: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
7160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
7170: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
7180: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
7190: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
71a0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
71b0: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
71c0: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
71d0: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
71e0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
71f0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
7200: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
7210: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
7220: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
7230: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
7240: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
7250: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
7260: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
7270: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
7280: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
7290: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
72a0: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
72b0: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
72c0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
72d0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
72e0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
72f0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
7300: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
7310: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
7320: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
7330: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
7340: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
7350: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
7360: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
7370: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
7380: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
7390: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
73a0: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
73b0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
73c0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
73d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
73e0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
73f0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
7400: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
7410: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
7420: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
7430: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
7440: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
7450: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
7460: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
7470: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
7480: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
7490: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
74a0: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
74b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
74c0: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
74d0: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
74e0: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
74f0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
7500: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7510: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
7520: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
7530: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
7540: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
7550: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
7560: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
7570: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7580: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
7590: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
75a0: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
75b0: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
75c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
75d0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
75e0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
75f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
7600: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
7610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7620: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
7630: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7640: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7650: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
7660: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
7670: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
7680: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
7690: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
76a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
76b0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
76c0: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
76d0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
76e0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
76f0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
7700: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
7710: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
7720: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
7730: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
7740: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
7750: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
7760: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
7770: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
7780: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
7790: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
77a0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
77b0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
77c0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
77d0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
77e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
77f0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
7800: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
7810: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
7820: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
7830: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
7840: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
7850: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
7860: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
7870: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
7880: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
7890: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
78a0: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
78b0: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
78c0: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
78d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
78e0: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
78f0: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
7900: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
7910: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
7920: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
7930: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
7940: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
7950: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
7960: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
7970: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
7980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
7990: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
79a0: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
79b0: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
79c0: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
79d0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
79e0: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
79f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
7a00: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
7a10: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
7a20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7a30: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
7a40: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
7a50: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
7a60: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
7a70: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
7a80: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
7a90: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
7aa0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
7ab0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
7ac0: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
7ad0: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
7ae0: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
7af0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
7b00: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
7b10: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
7b20: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
7b30: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
7b40: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
7b50: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7b60: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
7b70: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
7b80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7b90: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
7ba0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
7bb0: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
7bc0: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
7bd0: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
7be0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
7bf0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
7c00: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
7c10: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
7c20: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
7c30: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
7c40: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
7c50: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
7c60: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
7c70: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
7c80: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
7c90: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
7ca0: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
7cb0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
7cc0: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
7cd0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
7ce0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
7cf0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
7d00: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
7d10: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
7d20: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
7d30: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
7d40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
7d50: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
7d60: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
7d70: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
7d80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
7d90: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
7da0: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
7db0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
7dc0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
7dd0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
7de0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
7df0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
7e00: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
7e10: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
7e20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
7e30: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
7e40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
7e50: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
7e60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
7e70: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
7e80: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
7e90: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
7ea0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7eb0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
7ec0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
7ed0: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
7ee0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
7ef0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
7f00: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
7f10: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
7f20: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
7f30: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
7f40: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
7f50: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
7f60: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
7f70: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
7f80: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
7f90: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7fa0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
7fb0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
7fc0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
7fd0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
7fe0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
7ff0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
8000: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
8010: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
8020: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
8030: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
8040: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
8050: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
8060: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
8070: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
8080: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8090: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
80a0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
80b0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
80c0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
80d0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
80e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
80f0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
8100: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
8110: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
8120: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
8130: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
8140: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
8150: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8160: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
8170: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
8180: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
8190: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
81a0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
81b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
81c0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
81d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
81e0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
81f0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
8200: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
8210: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
8220: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
8230: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
8240: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
8250: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
8260: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
8270: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
8280: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
8290: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
82a0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
82b0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
82c0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
82d0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
82e0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
82f0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
8300: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
8310: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
8320: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
8330: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
8340: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
8350: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
8360: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
8370: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
8380: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
8390: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
83a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
83b0: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
83c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
83d0: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
83e0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
83f0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
8400: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
8410: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
8420: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
8430: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
8440: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
8450: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
8460: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
8470: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
8480: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
8490: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
84a0: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
84b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
84c0: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
84d0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
84e0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
84f0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
8500: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
8510: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
8520: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
8530: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
8540: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
8550: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
8560: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
8570: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
8580: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8590: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
85a0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
85b0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
85c0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
85d0: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
85e0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
85f0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
8600: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8610: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8620: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
8630: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
8640: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
8650: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
8660: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
8670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8680: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8690: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
86a0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
86b0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
86c0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
86d0: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
86e0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
86f0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
8700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
8710: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
8720: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
8730: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
8740: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
8750: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
8760: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
8770: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
8780: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
8790: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
87a0: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
87b0: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
87c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
87d0: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
87e0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
87f0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
8800: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
8810: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
8820: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
8830: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
8840: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
8850: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
8860: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
8870: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
8880: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
8890: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
88a0: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
88b0: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
88c0: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
88d0: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
88e0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
88f0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
8900: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
8910: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
8920: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
8930: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
8940: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
8950: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
8960: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
8970: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
8980: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
8990: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
89a0: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
89b0: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
89c0: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
89d0: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
89e0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
89f0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
8a00: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
8a10: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
8a20: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
8a30: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
8a40: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
8a50: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
8a60: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
8a70: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
8a80: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
8a90: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
8aa0: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
8ab0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
8ac0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
8ad0: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
8ae0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
8af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
8b00: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
8b10: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
8b20: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
8b30: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
8b40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
8b50: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8b60: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
8b70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8b80: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
8b90: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
8ba0: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
8bb0: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
8bc0: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
8bd0: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
8be0: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
8bf0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
8c00: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
8c10: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
8c20: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
8c30: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
8c40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8c50: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
8c60: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
8c70: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
8c80: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
8c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8ca0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8cb0: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
8cc0: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
8cd0: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
8ce0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8cf0: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
8d00: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
8d10: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
8d20: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
8d30: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
8d40: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
8d50: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
8d60: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
8d70: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
8d80: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
8d90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8da0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
8db0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
8dc0: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
8dd0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
8de0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
8df0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8e00: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
8e10: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
8e20: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
8e30: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
8e40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8e50: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
8e60: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
8e70: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
8e80: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
8e90: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8ea0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8eb0: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
8ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8ed0: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
8ee0: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
8ef0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8f00: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
8f10: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
8f20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8f30: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
8f40: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
8f50: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
8f60: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
8f70: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
8f80: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
8f90: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
8fb0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
8fc0: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
8fd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8fe0: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
8ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9000: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9010: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9020: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
9030: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
9040: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
9050: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
9060: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
9070: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
9080: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
9090: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
90a0: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
90b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
90c0: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
90d0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
90e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
90f0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
9100: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
9110: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
9120: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
9130: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
9140: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
9150: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9160: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
9170: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
9180: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
9190: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
91a0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
91b0: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
91c0: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
91d0: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
91e0: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
91f0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
9200: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9210: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
9220: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
9230: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
9240: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
9250: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9260: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
9270: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
9280: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
9290: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
92a0: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
92b0: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
92c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
92d0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
92e0: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
92f0: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
9300: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
9310: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
9320: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
9330: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
9340: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
9350: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
9360: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
9370: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
9380: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
9390: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
93a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
93b0: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
93c0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
93d0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
93e0: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
93f0: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 51 22 2c  XPrintf(p, "%Q",
9400: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
9410: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9420: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
9430: 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  GER:.      sqlit
9440: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 64  e3XPrintf(p, "%d
9450: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  ", pExpr->u.iVal
9460: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
9470: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
9480: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL:.      sqlite
9490: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c  3XPrintf(p, "NUL
94a0: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
94b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
94c0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
94d0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
94e0: 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72  , "r[%d]", pExpr
94f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
9500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9510: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9520: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
9530: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
9540: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9550: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 6f 77  3XPrintf(p, "row
9560: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
9570: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9580: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 63 25  e3XPrintf(p, "c%
9590: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
95a0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
95b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
95c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
95d0: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
95e0: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
95f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
9600: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
9610: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9620: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
9630: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
9640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9650: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
9660: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
9670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9680: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
9690: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
96a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
96b0: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
96c0: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
96d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
96e0: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
96f0: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
9700: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
9710: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
9720: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
9730: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
9740: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
9750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9760: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
9770: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
9780: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9790: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
97a0: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
97b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
97c0: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
97d0: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
97e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
97f0: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
9800: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9810: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
9820: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
9830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9840: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
9850: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
9860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9870: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
9880: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
9890: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
98a0: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
98b0: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
98c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
98d0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
98e0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
98f0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
9900: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
9910: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
9920: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
9930: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
9940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9950: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
9960: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
9970: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9980: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
9990: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
99a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
99b0: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
99c0: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
99d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
99e0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
99f0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9a00: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
9a10: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
9a20: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
9a30: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
9a40: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
9a50: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
9a60: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
9a70: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73  e3XPrintf(p, "%s
9a80: 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20  ", "expr");.    
9a90: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
9aa0: 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73  if( zOp ){.    s
9ab0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9ac0: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
9ad0: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28    displayP4Expr(
9ae0: 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  p, pExpr->pLeft)
9af0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
9b00: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
9b10: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
9b20: 41 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31  Append(p, ",", 1
9b30: 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  );.      display
9b40: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
9b50: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
9b60: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9b70: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 29 22  cumAppend(p, ")"
9b80: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 1);.  }.}.#end
9b90: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
9ba0: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
9bb0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9bc0: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a  URSOR_HINTS) */.
9bd0: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
9be0: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  AY_P4./*.** Comp
9bf0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
9c00: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
9c10: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
9c20: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
9c30: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
9c40: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
9c50: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
9c60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
9c70: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
9c80: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
9c90: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
9ca0: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
9cb0: 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b  p;.  StrAccum x;
9cc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
9cd0: 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  >=20 );.  sqlite
9ce0: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
9cf0: 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d  , 0, zTemp, nTem
9d00: 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  p, 0);.  switch(
9d10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
9d20: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
9d30: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
9d40: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
9d50: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
9d60: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
9d70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
9d80: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
9d90: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  er!=0 );.      s
9da0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9db0: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
9dc0: 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a  fo->nKeyField);.
9dd0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9de0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  <pKeyInfo->nKeyF
9df0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
9e00: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9e10: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
9e20: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
9e30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
9e40: 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f  ll = pColl ? pCo
9e50: 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a  ll->zName : "";.
9e60: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
9e70: 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52  mp(zColl, "BINAR
9e80: 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d  Y")==0 ) zColl =
9e90: 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71   "B";.        sq
9ea0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9eb0: 20 22 2c 25 73 25 73 22 2c 20 70 4b 65 79 49 6e   ",%s%s", pKeyIn
9ec0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
9ed0: 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43  ] ? "-" : "", zC
9ee0: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oll);.      }.  
9ef0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9f00: 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 29  cumAppend(&x, ")
9f10: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
9f20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
9f30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
9f40: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
9f50: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
9f60: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
9f70: 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e  xpr(&x, pOp->p4.
9f80: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  pExpr);.      br
9f90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
9fa0: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  f.    case P4_CO
9fb0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
9fc0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9fd0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
9fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9ff0: 6e 74 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29  ntf(&x, "(%.20s)
a000: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
a010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a020: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
a030: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
a040: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
a050: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
a060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
a070: 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64  rintf(&x, "%s(%d
a080: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
a090: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
a0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a0b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a0c0: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
a0d0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
a0e0: 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50 34 5f  LE).    case P4_
a0f0: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
a100: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
a110: 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70   pOp->p4.pCtx->p
a120: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
a130: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
a140: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
a150: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
a160: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a170: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a180: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
a190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
a1a0: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64  Printf(&x, "%lld
a1b0: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
a1c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a1d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
a1e0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
a1f0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
a200: 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  &x, "%d", pOp->p
a210: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
a220: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a230: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
a240: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
a250: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a  f(&x, "%.16g", *
a260: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
a270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a280: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
a290: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
a2a0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
a2b0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
a2c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
a2d0: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
a2e0: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
a2f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a300: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
a310: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
a320: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
a330: 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  &x, "%lld", pMem
a340: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
a350: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
a360: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
a370: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a380: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e  3XPrintf(&x, "%.
a390: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29  16g", pMem->u.r)
a3a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
a3b0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
a3c0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
a3d0: 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22      zP4 = "NULL"
a3e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a3f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a400: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
a410: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
a420: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
a430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a440: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
a450: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a460: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
a470: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
a480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
a490: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
a4a0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
a4b0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
a4c0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76 74 61  XPrintf(&x, "vta
a4d0: 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20  b:%p", pVtab);. 
a4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a4f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
a500: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
a510: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a520: 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f      int *ai = pO
a530: 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20  p->p4.ai;.      
a540: 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20  int n = ai[0];  
a550: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c   /* The first el
a560: 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41  ement of an INTA
a570: 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20 74  RRAY is always t
a580: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
a590: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75            ** cou
a5a0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
a5b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20   of elements to 
a5c0: 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  follow */.      
a5d0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69  for(i=1; i<=n; i
a5e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
a5f0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
a600: 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20  ",%d", ai[i]);. 
a610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
a620: 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20  mp[0] = '[';.   
a630: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
a640: 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d 22  umAppend(&x, "]"
a650: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
a660: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a670: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
a680: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
a690: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72 6f  XPrintf(&x, "pro
a6a0: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
a6b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a6c0: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
a6d0: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
a6e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
a6f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a700: 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20  e P4_TABLE: {.  
a710: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
a720: 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70  tf(&x, "%s", pOp
a730: 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65  ->p4.pTab->zName
a740: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a750: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
a760: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
a770: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
a780: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
a790: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
a7a0: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
a7b0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
a7c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
a7d0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
a7e0: 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65  nish(&x);.  asse
a7f0: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
a800: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
a810: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
a820: 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a  PLAY_P4 */../*.*
a830: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
a840: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
a850: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
a860: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
a870: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
a880: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
a890: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
a8a0: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
a8b0: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
a8c0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
a8d0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
a8e0: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
a8f0: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
a900: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
a910: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
a920: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
a930: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
a940: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
a950: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
a960: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
a970: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
a980: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a990: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
a9a0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
a9b0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
a9c0: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
a9d0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
a9e0: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
a9f0: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
aa00: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
aa10: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
aa20: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
aa30: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
aa40: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
aa50: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
aa60: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
aa70: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
aa80: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
aa90: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
aaa0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
aab0: 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a  ARED_CACHE)./*.*
aac0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
aad0: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
aae0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
aaf0: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
ab00: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
ab10: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
ab20: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
ab30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
ab40: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
ab50: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
ab60: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
ab70: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
ab80: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
ab90: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
aba0: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
abb0: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
abc0: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
abd0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
abe0: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
abf0: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
ac00: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
ac10: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
ac20: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
ac30: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
ac40: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
ac50: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
ac60: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
ac70: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
ac80: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
ac90: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
aca0: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
acb0: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
acc0: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
acd0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
ace0: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
acf0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
ad00: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
ad10: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
ad20: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
ad30: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
ad40: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
ad50: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
ad60: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
ad70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
ad80: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
ad90: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
ada0: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
adb0: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
adc0: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
add0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
ade0: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
adf0: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
ae00: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
ae10: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
ae20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
ae30: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
ae40: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
ae50: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
ae60: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
ae70: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
ae80: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
ae90: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
aea0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
aeb0: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
aec0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
aed0: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
aee0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
aef0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
af00: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
af10: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
af20: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
af30: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
af40: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
af50: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
af60: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
af70: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
af80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
af90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
afa0: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
afb0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
afc0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
afd0: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
afe0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
aff0: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29  nter(aDb[i].pBt)
b000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
b010: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
b020: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
b030: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
b040: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
b050: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  E>0./*.** Unlock
b060: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65   all of the btre
b070: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  es previously lo
b080: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  cked by a call t
b090: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  o sqlite3VdbeEnt
b0a0: 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er()..*/.static 
b0b0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
b0c0: 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56  void vdbeLeave(V
b0d0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
b0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
b0f0: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
b100: 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d  t nDb;.  db = p-
b110: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
b120: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
b130: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
b140: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
b150: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
b160: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
b170: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
b180: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
b190: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b1a0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
b1b0: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
b1c0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
b1d0: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
b1e0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61   *p){.  if( DbMa
b1f0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
b200: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
b210: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
b220: 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65  case */.  vdbeLe
b230: 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  ave(p);.}.#endif
b240: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44  ..#if defined(VD
b250: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64  BE_PROFILE) || d
b260: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
b270: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BUG)./*.** Print
b280: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
b290: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
b2a0: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  is used for debu
b2b0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  gging only..*/.v
b2c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
b2d0: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75  rintOp(FILE *pOu
b2e0: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70  t, int pc, Op *p
b2f0: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  Op){.  char *zP4
b300: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30  ;.  char zPtr[50
b310: 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31  ];.  char zCom[1
b320: 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  00];.  static co
b330: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
b340: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
b350: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33  %4d %4d %4d %-13
b360: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
b370: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
b380: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
b390: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
b3a0: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
b3b0: 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20  (zPtr));.#ifdef 
b3c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
b3d0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
b3e0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
b3f0: 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20  pOp, zP4, zCom, 
b400: 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23  sizeof(zCom));.#
b410: 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d  else.  zCom[0] =
b420: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20   0;.#endif.  /* 
b430: 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33  NB:  The sqlite3
b440: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e  OpcodeName() fun
b450: 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
b460: 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65  nted by code cre
b470: 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  ated.  ** by the
b480: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61   mkopcodeh.awk a
b490: 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b  nd mkopcodec.awk
b4a0: 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65   scripts which e
b4b0: 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20  xtract the.  ** 
b4c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
b4d0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
b4e0: 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72  ce text */.  fpr
b4f0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
b500: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
b510: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
b520: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
b530: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
b540: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
b550: 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a  pOp->p5,.      z
b560: 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73  Com.  );.  fflus
b570: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69  h(pOut);.}.#endi
b580: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  f../*.** Initial
b590: 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ize an array of 
b5a0: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a  N Mem element..*
b5b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
b5c0: 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a  itMemArray(Mem *
b5d0: 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65  p, int N, sqlite
b5e0: 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67 73  3 *db, u16 flags
b5f0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d  ){.  while( (N--
b600: 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62  )>0 ){.    p->db
b610: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c   = db;.    p->fl
b620: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
b630: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
b640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b650: 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53 63  DEBUG.    p->pSc
b660: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e  opyFrom = 0;.#en
b670: 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d  dif.    p++;.  }
b680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
b690: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
b6a0: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
b6b0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b6c0: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
b6d0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
b6e0: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
b6f0: 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e  Mem *pEnd = &p[N
b700: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
b710: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
b720: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
b730: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f  reed ){.      do
b740: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
b750: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
b760: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
b770: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
b780: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
b790: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  End );.      ret
b7a0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
b7b0: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
b7c0: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
b7d0: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
b7e0: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db );.      asse
b7f0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
b800: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
b810: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  s(p) );..      /
b820: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
b830: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
b840: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
b850: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
b860: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
b870: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
b880: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
b890: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
b8a0: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
b8b0: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
b8c0: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
b8d0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
b8e0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
b8f0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
b900: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
b910: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
b920: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
b930: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
b940: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
b950: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
b960: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
b970: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
b980: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
b990: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
b9a0: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
b9b0: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
b9c0: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
b9d0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
b9e0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
b9f0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
ba00: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
ba10: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
ba20: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
ba30: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
ba40: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
ba50: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
ba60: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
ba70: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
ba80: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
ba90: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
baa0: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
bab0: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
bac0: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
bad0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
bae0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
baf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bb00: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
bb10: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Agg );.      tes
bb20: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
bb30: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20  & MEM_Dyn );.   
bb40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
bb50: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d  flags & MEM_Fram
bb60: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
bb70: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
bb80: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20  MEM_RowSet );.  
bb90: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
bba0: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
bbb0: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
bbc0: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
bbd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
bbe0: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
bbf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
bc00: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
bc10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
bc20: 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  eNN(db, p->zMall
bc30: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
bc40: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
bc50: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
bc60: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
bc70: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c  fined;.    }whil
bc80: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
bc90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
bca0: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65  lete a VdbeFrame
bcb0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20   object and its 
bcc0: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72  contents. VdbeFr
bcd0: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a  ame objects are.
bce0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
bcf0: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f  the OP_Program o
bd00: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33  pcode in sqlite3
bd10: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76  VdbeExec()..*/.v
bd20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
bd30: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46  rameDelete(VdbeF
bd40: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rame *p){.  int 
bd50: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d  i;.  Mem *aMem =
bd60: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29   VdbeFrameMem(p)
bd70: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ;.  VdbeCursor *
bd80: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  *apCsr = (VdbeCu
bd90: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
bda0: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66  >nChildMem];.  f
bdb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
bdc0: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
bdd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
bde0: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
bdf0: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
be00: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
be10: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
be20: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  m);.  sqlite3Vdb
be30: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
be40: 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75  ->v->db, &p->pAu
be50: 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
be60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
be70: 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ->v->db, p);.}..
be80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
be90: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
bea0: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
beb0: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
bec0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
bed0: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
bee0: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
bef0: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
bf00: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
bf10: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
bf20: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
bf30: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
bf40: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
bf50: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
bf60: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
bf70: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
bf80: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
bf90: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  AIN"..**.** When
bfa0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
bfb0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
bfc0: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65   is listed.  Whe
bfd0: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  n.** p->explain=
bfe0: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c  =2, only OP_Expl
bff0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ain instructions
c000: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20   are listed and 
c010: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f  these.** are sho
c020: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  wn in a differen
c030: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78  t format.  p->ex
c040: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64  plain==2 is used
c050: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
c060: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c070: 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  LAN..**.** When 
c080: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66  p->explain==1, f
c090: 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72  irst the main pr
c0a0: 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c  ogram is listed,
c0b0: 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a   then each of.**
c0c0: 20 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62   the trigger sub
c0d0: 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73  programs are lis
c0e0: 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ted one by one..
c0f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c100: 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  beList(.  Vdbe *
c110: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
c120: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
c130: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77  */.){.  int nRow
c140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c160: 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f  Stop when row co
c170: 75 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73  unt reaches this
c180: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d   */.  int nSub =
c190: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c1b0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65  mber of sub-vdbe
c1c0: 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  s seen so far */
c1d0: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
c1e0: 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  apSub = 0;      
c1f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
c200: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f   of sub-vdbes */
c210: 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30  .  Mem *pSub = 0
c220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c230: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
c240: 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61  y cell hold arra
c250: 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f  y of subprogs */
c260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c270: 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20   p->db;         
c280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
c290: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c2a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  on */.  int i;  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c2d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
c2e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c2f0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
c300: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
c310: 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a   code */.  Mem *
c320: 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
c330: 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
c340: 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20  /* First Mem of 
c350: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
c360: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
c370: 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ain );.  assert(
c380: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
c390: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61  MAGIC_RUN );.  a
c3a0: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
c3b0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
c3c0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
c3d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
c3e0: 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  OMEM );..  /* Ev
c3f0: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
c400: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75  pcode does not u
c410: 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  se dynamic strin
c420: 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  gs for.  ** the 
c430: 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63  result, result c
c440: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d  olumns may becom
c450: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65  e dynamic if the
c460: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a   user calls.  **
c470: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c480: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e  text16(), causin
c490: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  g a translation 
c4a0: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  to UTF-16 encodi
c4b0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61  ng..  */.  relea
c4c0: 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c  seMemArray(pMem,
c4d0: 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c   8);.  p->pResul
c4e0: 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  tSet = 0;..  if(
c4f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
c500: 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20  OMEM_BKPT ){.   
c510: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
c520: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
c530: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
c540: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
c550: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
c560: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
c570: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
c580: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
c590: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
c5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
c5b0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
c5c0: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
c5d0: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72  of output rows r
c5e0: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61  eaches nRow, tha
c5f0: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a  t means the.  **
c600: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e   listing has fin
c610: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65  ished and sqlite
c620: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20  3_step() should 
c630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
c640: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73  NE..  ** nRow is
c650: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c660: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
c670: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  n the main progr
c680: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68  am, plus.  ** th
c690: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
c6a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61  ber of rows in a
c6b0: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ll trigger subpr
c6c0: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72  ograms encounter
c6d0: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20  ed.  ** so far. 
c6e0: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
c6f0: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73  will increase as
c700: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62   new trigger sub
c710: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a  programs are.  *
c720: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62  * encountered, b
c730: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76  ut p->pc will ev
c740: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75  entually catch u
c750: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a  p to nRow..  */.
c760: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b    nRow = p->nOp;
c770: 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69  .  if( p->explai
c780: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==1 ){.    /* T
c790: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72  he first 8 memor
c7a0: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64  y cells are used
c7b0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
c7c0: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c  set.  So we will
c7d0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65  .    ** commande
c7e0: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20  er the 9th cell 
c7f0: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67  to use as storag
c800: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f  e for an array o
c810: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a  f pointers.    *
c820: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62  * to trigger sub
c830: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56  programs.  The V
c840: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65  DBE is guarantee
c850: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61  d to have at lea
c860: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  st 9.    ** cell
c870: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
c880: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a  t( p->nMem>9 );.
c890: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61      pSub = &p->a
c8a0: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20  Mem[9];.    if( 
c8b0: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pSub->flags&MEM_
c8c0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Blob ){.      /*
c8d0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   On the first ca
c8e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ll to sqlite3_st
c8f0: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20  ep(), pSub will 
c900: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74  hold a NULL.  It
c910: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69   is.      ** ini
c920: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c  tialized to a BL
c930: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42  OB by the P4_SUB
c940: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69  PROGRAM processi
c950: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a  ng logic below *
c960: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70  /.      nSub = p
c970: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64  Sub->n/sizeof(Vd
c980: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75  be*);.      apSu
c990: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
c9a0: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
c9b0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
c9c0: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSub; i++){.   
c9d0: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62     nRow += apSub
c9e0: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  [i]->nOp;.    }.
c9f0: 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69    }..  do{.    i
ca00: 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77   = p->pc++;.  }w
ca10: 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20  hile( i<nRow && 
ca20: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
ca30: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
ca40: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
ca50: 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29  .  if( i>=nRow )
ca60: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
ca70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
ca80: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
ca90: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75   }else if( db->u
caa0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
cab0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
cac0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
cad0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
cae0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
caf0: 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
cb00: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
cb10: 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >rc));.  }else{.
cb20: 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20      char *zP4;. 
cb30: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
cb40: 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a  if( i<p->nOp ){.
cb50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74        /* The out
cb60: 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  put line number 
cb70: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
cb80: 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c  that we are stil
cb90: 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  l in the.      *
cba0: 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20  * main program. 
cbb0: 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26  */.      pOp = &
cbc0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  p->aOp[i];.    }
cbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
cbe0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
cbf0: 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72  listing subprogr
cc00: 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74  ams.  Figure out
cc10: 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20   which one and. 
cc20: 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20       ** pick up 
cc30: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
cc40: 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  opcode. */.     
cc50: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20   int j;.      i 
cc60: 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  -= p->nOp;.     
cc70: 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53   for(j=0; i>=apS
cc80: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29  ub[j]->nOp; j++)
cc90: 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61  {.        i -= a
cca0: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[j]->nOp;.  
ccb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20      }.      pOp 
ccc0: 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70  = &apSub[j]->aOp
ccd0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [i];.    }.    i
cce0: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
ccf0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
cd00: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
cd10: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
cd20: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
cd50: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
cd60: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
cd70: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
cd80: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
cd90: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
cda0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
cdb0: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
cdc0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
cdd0: 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  e); /* Opcode */
cde0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cdf0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
ce00: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
ce10: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
ce20: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
ce30: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
ce40: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
ce50: 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  ++;..      /* Wh
ce60: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
ce70: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
ce80: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
ce90: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
cea0: 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42       ** a P4_SUB
ceb0: 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74  PROGRAM argument
cec0: 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69  ), expand the si
ced0: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
cee0: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20  of subprograms. 
cef0: 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20       ** kept in 
cf00: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20  p->aMem[9].z to 
cf10: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f  hold the new pro
cf20: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20  gram - assuming 
cf30: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a  this subprogram.
cf40: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74        ** has not
cf50: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
cf60: 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  en..      */.   
cf70: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
cf80: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
cf90: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
cfa0: 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31   nByte = (nSub+1
cfb0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
cfc0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69  ram*);.        i
cfd0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
cfe0: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a  r(j=0; j<nSub; j
cff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
d000: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70  f( apSub[j]==pOp
d010: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
d020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
d030: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
d040: 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f  nSub && SQLITE_O
d050: 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65  K==sqlite3VdbeMe
d060: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
d070: 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20  e, nSub!=0) ){. 
d080: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d           apSub =
d090: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
d0a0: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20  pSub->z;.       
d0b0: 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d     apSub[nSub++]
d0c0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
d0d0: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ram;.          p
d0e0: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Sub->flags |= ME
d0f0: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  M_Blob;.        
d100: 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62    pSub->n = nSub
d110: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
d120: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  am*);.        }.
d130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
d140: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
d150: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
d160: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
d170: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
d180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d190: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  1 */.    pMem++;
d1a0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
d1b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
d1c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
d1d0: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1f0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
d200: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
d210: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
d220: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
d230: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70    /* P3 */.    p
d260: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
d270: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
d280: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
d290: 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34  m, 100) ){ /* P4
d2a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
d2b0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
d2c0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
d2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
d2e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  OR;.    }.    pM
d2f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
d300: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
d310: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
d320: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  4(pOp, pMem->z, 
d330: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b  pMem->szMalloc);
d340: 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d  .    if( zP4!=pM
d350: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70  em->z ){.      p
d360: 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20  Mem->n = 0;.    
d370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
d380: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34  SetStr(pMem, zP4
d390: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
d3a0: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  8, 0);.    }else
d3b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d3c0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
d3d0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
d3e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
d3f0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
d400: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
d410: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
d420: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
d430: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
d440: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
d450: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
d460: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
d470: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  4) ){.        as
d480: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
d490: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
d4a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d4b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
d4c0: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
d4d0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
d4e0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
d4f0: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20  em->n = 2;.     
d500: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d510: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25  f(3, pMem->z, "%
d520: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20  .2x", pOp->p5); 
d530: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20    /* P5 */.     
d540: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
d550: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
d560: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65  pMem++;.  .#ifde
d570: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d580: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
d590: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
d5a0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
d5b0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30  dResize(pMem, 50
d5c0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  0) ){.        as
d5d0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
d5e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
d5f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d600: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
d610: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
d620: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
d630: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
d640: 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43  em->n = displayC
d650: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
d660: 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a   pMem->z, 500);.
d670: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
d680: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
d690: 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d  else.      pMem-
d6a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
d6b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
d6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
d6d0: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ent */.#endif.  
d6e0: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
d6f0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
d700: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
d710: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
d720: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
d730: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
d740: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
d750: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
d760: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
d770: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d780: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
d790: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d7a0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
d7b0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
d7c0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
d7d0: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
d7e0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
d7f0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
d800: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  dbe *p){.  const
d810: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
d820: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
d830: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a     z = p->zSql;.
d840: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
d850: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  Op>=1 ){.    con
d860: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  st VdbeOp *pOp =
d870: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20   &p->aOp[0];.   
d880: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
d890: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
d8a0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
d8b0: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a     z = pOp->p4.z
d8c0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
d8d0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
d8e0: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) z++;.    }. 
d8f0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69   }.  if( z ) pri
d900: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
d910: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ", z);.}.#endif.
d920: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d930: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
d940: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
d950: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
d960: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
d970: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
d980: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
d990: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
d9a0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
d9b0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
d9c0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
d9d0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
d9e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
d9f0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
da00: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
da10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
da20: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
da30: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
da40: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
da50: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
da60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
da70: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
da80: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
da90: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
daa0: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
dab0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
dac0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
dad0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
dae0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
daf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
db00: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
db10: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
db20: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
db30: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
db40: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
db50: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
db60: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
db70: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
db80: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
db90: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
dba0: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
dbb0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
dbc0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
dbd0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
dbe0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
dbf0: 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  E */../* An inst
dc00: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
dc10: 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75  ect describes bu
dc20: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
dc30: 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62  ble for use.** b
dc40: 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20  y subcomponents 
dc50: 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74  of a prepared st
dc60: 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20  atement.  Space 
dc70: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74  is allocated out
dc80: 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c  .** of a Reusabl
dc90: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79  eSpace object by
dca0: 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28   the allocSpace(
dcb0: 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e  ) routine below.
dcc0: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61  .*/.struct Reusa
dcd0: 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20  bleSpace {.  u8 
dce0: 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
dcf0: 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d    /* Available m
dd00: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
dd10: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
dd20: 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 69  /* Bytes of avai
dd30: 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  lable memory */.
dd40: 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20    int nNeeded;  
dd50: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
dd60: 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64  bytes that could
dd70: 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
dd80: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20  d */.};../* Try 
dd90: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74  to allocate nByt
dda0: 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74  e bytes of 8-byt
ddb0: 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d  e aligned bulk m
ddc0: 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a  emory for pBuf.*
ddd0: 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61  * from the Reusa
dde0: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e  bleSpace object.
ddf0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
de00: 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
de10: 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e  ted.** memory on
de20: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e   success.  If in
de30: 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72  sufficient memor
de40: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  y is available i
de50: 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c  n the.** Reusabl
de60: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69  eSpace object, i
de70: 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73  ncrease the Reus
de80: 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65  ableSpace.nNeede
de90: 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68  d.** value by th
dea0: 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20  e amount needed 
deb0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
dec0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69  .**.** If pBuf i
ded0: 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20  s not initially 
dee0: 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73  NULL, that means
def0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
df00: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
df10: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  been allocated b
df20: 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  y a prior call t
df30: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  o this routine, 
df40: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  so just return a
df50: 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66   copy.** of pBuf
df60: 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61   and leave Reusa
df70: 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67  bleSpace unchang
df80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61  ed..**.** This a
df90: 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c  llocator is empl
dfa0: 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73  oyed to repurpos
dfb0: 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61  e unused slots a
dfc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
dfd0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79  .** opcode array
dfe0: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61   of prepared sta
dff0: 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d  te for other mem
e000: 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65  ory needs of the
e010: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
e020: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  tement..*/.stati
e030: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
e040: 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75  ce(.  struct Reu
e050: 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20  sableSpace *p,  
e060: 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61  /* Bulk memory a
e070: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
e080: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
e090: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
e0a0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
e0b0: 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c  r to a prior all
e0c0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ocation */.  int
e0d0: 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
e0e0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e0f0: 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
e100: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
e110: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
e120: 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29  NMENT(p->pSpace)
e130: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d   );.  if( pBuf==
e140: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
e150: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
e160: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d      if( nByte <=
e170: 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20   p->nFree ){.   
e180: 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e     p->nFree -= n
e190: 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66  Byte;.      pBuf
e1a0: 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d   = &p->pSpace[p-
e1b0: 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c  >nFree];.    }el
e1c0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65  se{.      p->nNe
e1d0: 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  eded += nByte;. 
e1e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
e1f0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
e200: 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b  IGNMENT(pBuf) );
e210: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
e220: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
e230: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
e240: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
e250: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
e260: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
e270: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e280: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
e290: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
e2a0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
e2b0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
e2c0: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
e2d0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
e2e0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
e2f0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
e300: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c  BE_MAGIC_INIT ||
e310: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
e320: 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a  MAGIC_RESET );..
e330: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
e340: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
e350: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
e360: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
e370: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
e380: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
e390: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
e3a0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
e3b0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
e3c0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
e3d0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
e3e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
e3f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
e400: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
e410: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
e420: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
e430: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
e440: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
e450: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
e460: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
e470: 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  ort;.  p->nChang
e480: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
e490: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
e4a0: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
e4b0: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
e4c0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
e4d0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
e4e0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
e4f0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28  E_PROFILE.  for(
e500: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
e510: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  ++){.    p->aOp[
e520: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
e530: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
e540: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
e550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
e560: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
e570: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
e580: 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
e590: 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72  time after.** cr
e5a0: 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75  eating the virtu
e5b0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69  al machine.  Thi
e5c0: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
e5d0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
e5e0: 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72  ocating register
e5f0: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  s and initializi
e600: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
e610: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
e620: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
e630: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
e640: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
e650: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
e660: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
e670: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
e680: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e690: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
e6a0: 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65  xactly once on e
e6b0: 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68  ach virtual mach
e6c0: 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ine..** After th
e6d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e6e0: 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20  lled the VM has 
e6f0: 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20  been "packaged" 
e700: 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20  and is ready.** 
e710: 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74  to run.  After t
e720: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e730: 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63  alled, further c
e740: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  alls to .** sqli
e750: 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66  te3VdbeAddOp() f
e760: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f  unctions are pro
e770: 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72  hibited.  This r
e780: 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63  outine disconnec
e790: 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66  ts.** the Vdbe f
e7a0: 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62  rom the Parse ob
e7b0: 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64  ject that helped
e7c0: 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20   generate it so 
e7d0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20  that the.** the 
e7e0: 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20  Vdbe becomes an 
e7f0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69  independent enti
e800: 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65  ty and the Parse
e810: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a   object can be.*
e820: 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  * destroyed..**.
e830: 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  ** Use the sqlit
e840: 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70  e3VdbeRewind() p
e850: 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74  rocedure to rest
e860: 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  ore a virtual ma
e870: 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f  chine back.** to
e880: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61   its initial sta
e890: 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20  te after it has 
e8a0: 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  been run..*/.voi
e8b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
e8c0: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
e8d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e8f0: 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20  VDBE */.  Parse 
e900: 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20  *pParse         
e910: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
e920: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29  ing context */.)
e930: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
e960: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
e970: 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20  .  int nVar;    
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
e9a0: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69  arameters */.  i
e9b0: 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  nt nMem;        
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9d0: 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65   Number of VM me
e9e0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a  mory registers *
e9f0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b  /.  int nCursor;
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ea20: 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64  cursors required
ea30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ea60: 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73  f arguments in s
ea70: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
ea80: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eaa0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
eab0: 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61  /.  struct Reusa
eac0: 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20  bleSpace x;     
ead0: 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62     /* Reusable b
eae0: 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20  ulk memory */.. 
eaf0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
eb00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
eb10: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
eb20: 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
eb30: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
eb40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
eb50: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  T );.  assert( p
eb60: 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65  Parse==p->pParse
eb70: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
eb80: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
eb90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
eba0: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
ebb0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
ebc0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
ebd0: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
ebe0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
ebf0: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
ec00: 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63  Arg;.  .  /* Eac
ec10: 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20  h cursor uses a 
ec20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68  memory cell.  Th
ec30: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28  e first cursor (
ec40: 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20  cursor 0) can.  
ec50: 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77  ** use aMem[0] w
ec60: 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65  hich is not othe
ec70: 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68  rwise used by th
ec80: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
ec90: 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   Allocate.  ** s
eca0: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
ecb0: 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75  of aMem[] for cu
ecc0: 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61  rsors 1 and grea
ecd0: 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c  ter..  ** See al
ece0: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
ecf0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
ed00: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  m += nCursor;.  
ed10: 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26  if( nCursor==0 &
ed20: 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b  & nMem>0 ) nMem+
ed30: 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72  +;  /* Space for
ed40: 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66   aMem[0] even if
ed50: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20   not used */..  
ed60: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
ed70: 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20  w much reusable 
ed80: 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61  memory is availa
ed90: 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ble at the end o
eda0: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64  f the.  ** opcod
edb0: 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65  e array.  This e
edc0: 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  xtra memory will
edd0: 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
ede0: 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e  for other elemen
edf0: 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ts.  ** of the p
ee00: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ee10: 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f  t..  */.  n = RO
ee20: 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a  UND8(sizeof(Op)*
ee30: 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20  p->nOp);        
ee40: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
ee50: 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  f opcode memory 
ee60: 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61  used */.  x.pSpa
ee70: 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61  ce = &((u8*)p->a
ee80: 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20  Op)[n];         
ee90: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
eea0: 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f  opcode memory */
eeb0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
eec0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
eed0: 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78  x.pSpace) );.  x
eee0: 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f  .nFree = ROUNDDO
eef0: 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70  WN8(pParse->szOp
ef00: 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20  Alloc - n);  /* 
ef10: 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  Bytes of unused 
ef20: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
ef30: 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29  rt( x.nFree>=0 )
ef40: 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
ef50: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
ef60: 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72  (&x.pSpace[x.nFr
ef70: 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ee]) );..  resol
ef80: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
ef90: 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
efa0: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
efb0: 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
efc0: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
efd0: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
efe0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
eff0: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
f000: 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
f010: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64    }.  p->expired
f020: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
f030: 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
f040: 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
f050: 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
f060: 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f  located in one o
f070: 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  r two.  ** passe
f080: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
f090: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
f0a0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65   reuse unused me
f0b0: 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a  mory at the .  *
f0c0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  * end of the opc
f0d0: 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77  ode array.  If w
f0e0: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
f0f0: 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f  satisfy all memo
f100: 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d  ry.  ** requirem
f110: 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20  ents by reusing 
f120: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
f130: 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20   tail, then the 
f140: 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73  second.  ** pass
f150: 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68   will fill in th
f160: 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e  e remainder usin
f170: 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79  g a fresh memory
f180: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
f190: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77   **.  ** This tw
f1a0: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
f1b0: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
f1c0: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
f1d0: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a  ssible from.  **
f1e0: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65   the leftover me
f1f0: 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20  mory at the end 
f200: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
f210: 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73  ray.  This can s
f220: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
f230: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
f240: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
f250: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
f260: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
f270: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e  .  do {.    x.nN
f280: 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  eeded = 0;.    p
f290: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70  ->aMem = allocSp
f2a0: 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c  ace(&x, p->aMem,
f2b0: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
f2c0: 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20  ));.    p->aVar 
f2d0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
f2e0: 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73   p->aVar, nVar*s
f2f0: 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20  izeof(Mem));.   
f300: 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
f310: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
f320: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
f330: 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e  (Mem*));.    p->
f340: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
f350: 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c  ce(&x, p->apCsr,
f360: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
f370: 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23  VdbeCursor*));.#
f380: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f390: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
f3a0: 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65  TUS.    p->anExe
f3b0: 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  c = allocSpace(&
f3c0: 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d  x, p->anExec, p-
f3d0: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29  >nOp*sizeof(i64)
f3e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
f3f0: 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29  ( x.nNeeded==0 )
f400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53   break;.    x.pS
f410: 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20  pace = p->pFree 
f420: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
f430: 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65  cRawNN(db, x.nNe
f440: 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72  eded);.    x.nFr
f450: 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a  ee = x.nNeeded;.
f460: 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d    }while( !db->m
f470: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
f480: 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50    p->pVList = pP
f490: 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20  arse->pVList;.  
f4a0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d  pParse->pVList =
f4b0: 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69    0;.  p->explai
f4c0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
f4d0: 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ain;.  if( db->m
f4e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f4f0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a     p->nVar = 0;.
f500: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
f510: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   0;.    p->nMem 
f520: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
f530: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
f540: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e  Cursor;.    p->n
f550: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61  Var = (ynVar)nVa
f560: 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72  r;.    initMemAr
f570: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61  ray(p->aVar, nVa
f580: 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  r, db, MEM_Null)
f590: 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
f5a0: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65  nMem;.    initMe
f5b0: 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20  mArray(p->aMem, 
f5c0: 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e  nMem, db, MEM_Un
f5d0: 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65  defined);.    me
f5e0: 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30  mset(p->apCsr, 0
f5f0: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
f600: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a  (VdbeCursor*));.
f610: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f620: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
f630: 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28  ATUS.    memset(
f640: 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d  p->anExec, 0, p-
f650: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29  >nOp*sizeof(i64)
f660: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
f670: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
f680: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
f690: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
f6a0: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
f6b0: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
f6c0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
f6d0: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
f6e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f6f0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
f700: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
f710: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
f720: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
f730: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
f740: 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d  ert( pCx->pBtx==
f750: 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79  0 || pCx->eCurTy
f760: 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
f770: 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  E );.  switch( p
f780: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a  Cx->eCurType ){.
f790: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
f7a0: 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20  _SORTER: {.     
f7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
f7c0: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
f7d0: 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Cx);.      break
f7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f7f0: 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20   CURTYPE_BTREE: 
f800: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d  {.      if( pCx-
f810: 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  >isEphemeral ){.
f820: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78 2d          if( pCx-
f830: 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33 42  >pBtx ) sqlite3B
f840: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
f850: 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Btx);.        /*
f860: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
f870: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
f880: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
f890: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
f8a0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63          ** the c
f8b0: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
f8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f8d0: 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e     assert( pCx->
f8e0: 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
f8f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f900: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
f910: 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72  (pCx->uc.pCursor
f920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
f940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f950: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
f960: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
f970: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
f980: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
f990: 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e  r *pVCur = pCx->
f9a0: 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20  uc.pVCur;.      
f9b0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
f9c0: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
f9d0: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d  pVCur->pVtab->pM
f9e0: 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73  odule;.      ass
f9f0: 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61  ert( pVCur->pVta
fa00: 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  b->nRef>0 );.   
fa10: 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d     pVCur->pVtab-
fa20: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70  >nRef--;.      p
fa30: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
fa40: 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65  VCur);.      bre
fa50: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
fa60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
fa70: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
fa80: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
fa90: 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rame..*/.static 
faa0: 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72  void closeCursor
fab0: 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70  sInFrame(Vdbe *p
fac0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ){.  if( p->apCs
fad0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
fae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
faf0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
fb00: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
fb10: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
fb20: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
fb30: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
fb40: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
fb50: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
fb60: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
fb70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
fb80: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
fb90: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
fba0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
fbb0: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
fbc0: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
fbd0: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
fbe0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
fbf0: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
fc00: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
fc10: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
fc20: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
fc30: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
fc40: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
fc50: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
fc60: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
fc70: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
fc80: 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72  e->v;.  closeCur
fc90: 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a  sorsInFrame(v);.
fca0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
fcb0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
fcc0: 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63  ATUS.  v->anExec
fcd0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65   = pFrame->anExe
fce0: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61  c;.#endif.  v->a
fcf0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
fd00: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
fd10: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
fd20: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
fd30: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
fd40: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
fd50: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
fd60: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
fd70: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
fd80: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
fd90: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
fda0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
fdb0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
fdc0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
fdd0: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e  ;.  v->db->nChan
fde0: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62  ge = pFrame->nDb
fdf0: 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65  Change;.  sqlite
fe00: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
fe10: 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41  ta(v->db, &v->pA
fe20: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
fe30: 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20    v->pAuxData = 
fe40: 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
fe50: 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78  ;.  pFrame->pAux
fe60: 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75  Data = 0;.  retu
fe70: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
fe80: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
fe90: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
fea0: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
feb0: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
fec0: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
fed0: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
fee0: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
fef0: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
ff00: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
ff10: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
ff20: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
ff30: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
ff40: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
ff50: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
ff60: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
ff70: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
ff80: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
ff90: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
ffa0: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
ffb0: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
ffc0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
ffd0: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66  e *pFrame;.    f
ffe0: 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
fff0: 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
10000 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
10010 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
10020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
10030 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
10040 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d  e);.    p->pFram
10050 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46  e = 0;.    p->nF
10060 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rame = 0;.  }.  
10070 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d  assert( p->nFram
10080 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43  e==0 );.  closeC
10090 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29  ursorsInFrame(p)
100a0 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
100b0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
100c0 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20  mArray(p->aMem, 
100d0 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  p->nMem);.  }.  
100e0 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72  while( p->pDelFr
100f0 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
10100 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e  rame *pDel = p->
10110 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70  pDelFrame;.    p
10120 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44  ->pDelFrame = pD
10130 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  el->pParent;.   
10140 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
10150 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  eDelete(pDel);. 
10160 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
10170 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f  any auxdata allo
10180 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20  cations made by 
10190 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20  the VM */.  if( 
101a0 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71  p->pAuxData ) sq
101b0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
101c0 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70  uxData(p->db, &p
101d0 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
101e0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0);.  assert( p-
101f0 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a  >pAuxData==0 );.
10200 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
10210 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
10220 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
10230 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
10240 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
10250 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
10260 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
10270 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
10280 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
10290 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
102a0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
102b0 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
102c0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
102d0 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
102e0 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
102f0 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
10300 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
10310 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
10320 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
10330 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
10340 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
10350 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
10360 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 73  ;..  if( p->nRes
10370 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65  Column ){.    re
10380 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
10390 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
103a0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
103b0 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  _N);.    sqlite3
103c0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
103d0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e  olName);.  }.  n
103e0 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
103f0 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
10400 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
10410 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
10420 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d  >aColName = (Mem
10430 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
10440 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
10450 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
10460 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
10470 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69   ) return;.  ini
10480 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  tMemArray(p->aCo
10490 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d 45  lName, n, db, ME
104a0 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  M_Null);.}../*.*
104b0 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
104c0 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
104d0 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
104e0 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
104f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
10500 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
10510 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
10520 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
10530 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
10540 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
10550 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
10560 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
10570 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
10580 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
10590 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
105a0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
105b0 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
105c0 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
105d0 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
105e0 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
105f0 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
10600 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
10610 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
10620 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
10630 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
10640 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
10650 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
10660 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
10670 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
10680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
106a0 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
106b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
106e0 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
106f0 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
10700 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
10730 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
10740 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
10750 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
10760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10770 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
10780 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
10790 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
107a0 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
107b0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
107c0 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
107d0 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
107e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
107f0 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
10800 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
10810 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
10820 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
10830 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
10840 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10850 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
10860 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
10870 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
10880 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
10890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
108a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
108b0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
108c0 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
108d0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
108e0 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
108f0 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
10900 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
10910 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
10920 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
10930 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
10940 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
10950 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
10960 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
10970 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
10980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
10990 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
109a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
109b0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
109c0 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
109d0 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
109e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
109f0 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
10a00 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
10a10 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
10a20 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
10a30 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
10a40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
10a50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
10a60 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
10a70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
10a80 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
10a90 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
10aa0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
10ab0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
10ac0 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
10ad0 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
10ae0 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
10af0 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
10b00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20  -transaction.   
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64  ** that are cand
10b30 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f  idates for a two
10b40 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73  -phase commit us
10b50 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20  ing a.          
10b60 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74           ** mast
10b70 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er-journal */.  
10b80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10b90 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63  OK;.  int needXc
10ba0 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64  ommit = 0;..#ifd
10bb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10bc0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
10bd0 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f   With this optio
10be0 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79  n, sqlite3VtabSy
10bf0 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  nc() is defined 
10c00 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20  to be simply .  
10c10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20  ** SQLITE_OK so 
10c20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a  p is not used. .
10c30 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
10c40 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64  RAMETER(p);.#end
10c50 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  if..  /* Before 
10c60 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
10c70 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
10c80 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
10c90 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
10ca0 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
10cb0 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
10cc0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
10cd0 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
10ce0 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
10cf0 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
10d00 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
10d10 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
10d20 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
10d30 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
10d40 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
10d50 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
10d60 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
10d70 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
10d80 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
10d90 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20  Sync(db, p);..  
10da0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
10db0 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
10dc0 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
10dd0 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
10de0 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
10df0 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
10e00 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
10e10 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
10e20 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
10e30 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
10e40 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
10e50 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
10e60 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
10e70 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
10e80 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
10e90 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
10ea0 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
10eb0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
10ec0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
10ed0 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
10ee0 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
10ef0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
10f00 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
10f10 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
10f20 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10f30 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
10f40 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
10f50 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
10f60 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
10f70 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61   or not a databa
10f80 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  se might need a 
10f90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10fa0 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20  epends upon.    
10fb0 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c    ** its journal
10fc0 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68   mode (among oth
10fd0 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69  er things).  Thi
10fe0 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69  s matrix determi
10ff0 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  nes which.      
11000 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73  ** journal modes
11010 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f   use a master jo
11020 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20  urnal and which 
11030 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  do not */.      
11040 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
11050 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a  aMJNeeded[] = {.
11060 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54          /* DELET
11070 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20  E   */  1,.     
11080 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20     /* PERSIST   
11090 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 1,.        /*
110a0 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c   OFF       */ 0,
110b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e  .        /* TRUN
110c0 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20  CATE  */ 1,.    
110d0 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20      /* MEMORY   
110e0 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f   */ 0,.        /
110f0 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30  * WAL       */ 0
11100 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
11110 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
11120 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69   /* Pager associ
11130 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f  ated with pBt */
11140 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
11150 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  it = 1;.      sq
11160 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11170 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pBt);.      pPag
11180 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
11190 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
111a0 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
111b0 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ].safety_level!=
111c0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
111d0 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20  S_OFF.       && 
111e0 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65  aMJNeeded[sqlite
111f0 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c  3PagerGetJournal
11200 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20  Mode(pPager)].  
11210 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20      ){ .        
11220 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a  assert( i!=1 );.
11230 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b          nTrans++
11240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11250 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11260 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
11270 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
11280 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11290 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
112a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
112b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
112c0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
112d0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
112e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
112f0 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
11300 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
11310 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
11320 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
11330 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
11340 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
11350 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
11360 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
11370 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
11380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11390 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
113a0 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  MITHOOK;.    }. 
113b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
113c0 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
113d0 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
113e0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
113f0 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
11400 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
11410 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
11420 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
11430 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
11440 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
11450 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
11460 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
11470 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
11480 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
11490 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
114a0 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
114b0 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
114c0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
114d0 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
114e0 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
114f0 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
11500 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
11510 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
11520 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
11530 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
11540 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
11550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
11560 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11570 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
11580 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
11590 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
115a0 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
115b0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
115c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
115d0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
115e0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
115f0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11600 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
11610 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11620 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
11630 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
11640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11650 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
11660 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
11670 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
11680 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
11690 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
116a0 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
116b0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
116c0 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
116d0 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
116e0 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
116f0 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
11700 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
11710 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
11720 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
11730 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
11740 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
11750 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
11760 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
11770 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
11780 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
11790 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
117a0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
117b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
117c0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
117d0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
117e0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
117f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11800 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11810 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
11820 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
11830 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11840 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11850 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
11860 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11870 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
11880 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
11890 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
118a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
118b0 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
118c0 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
118d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
118e0 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
118f0 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
11900 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61  ommitted atomica
11910 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  lly..  */.#ifnde
11920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
11930 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
11940 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
11950 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
11960 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
11970 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
11980 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
11990 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
119a0 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
119b0 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
119c0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
119d0 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
119e0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
119f0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
11a00 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
11a10 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
11a20 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
11a30 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
11a40 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
11a50 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
11a60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11a70 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
11a80 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
11a90 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
11aa0 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
11ab0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
11ac0 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
11ad0 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
11ae0 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
11af0 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
11b00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11b10 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a  _BKPT;.    do {.
11b20 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
11b30 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
11b40 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
11b50 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
11b60 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
11b70 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
11b80 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
11b90 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
11ba0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
11bb0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11bc0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11bd0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
11be0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
11bf0 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
11c00 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
11c10 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
11c20 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
11c30 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
11c40 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
11c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
11c60 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
11c70 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
11c80 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
11c90 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
11ca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11cb0 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
11cc0 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
11cd0 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
11ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
11d10 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
11d20 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
11d30 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
11d40 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
11d50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11d60 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
11d70 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
11d80 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
11d90 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
11da0 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
11db0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11dc0 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
11dd0 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
11de0 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
11df0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
11e00 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
11e10 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11e30 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
11e40 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
11e50 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
11e60 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
11e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11e80 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
11e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11ea0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
11eb0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11ec0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
11ed0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
11ee0 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
11ef0 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
11f00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11f10 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
11f20 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11f30 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
11f40 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
11f50 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
11f60 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
11f70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
11f80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11fa0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11fb0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
11fd0 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
11fe0 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
11ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12000 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
12010 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
12020 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
12030 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
12040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
12050 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
12060 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
12070 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
12080 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
12090 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
120a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
120b0 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
120c0 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
120d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
120e0 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
120f0 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
12100 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
12110 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
12120 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
12130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
12140 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
12150 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
12160 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12170 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12180 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
12190 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
121a0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
121b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
121c0 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
121d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
121e0 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
121f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
12200 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
12210 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
12220 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
12230 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
12240 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
12250 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
12260 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
12270 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
12280 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12290 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
122a0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
122b0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
122c0 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
122d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
122e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
122f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
12300 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
12310 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12320 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
12330 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
12340 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12350 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
12360 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
12370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12380 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12390 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
123a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
123b0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
123c0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
123d0 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
123e0 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
123f0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
12400 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30      */.    if( 0
12410 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
12420 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
12430 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
12440 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
12450 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
12460 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
12470 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
12480 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
12490 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
124a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
124b0 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
124c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
124d0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
124e0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
124f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12500 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12520 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
12530 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
12540 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
12550 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
12560 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
12570 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
12580 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
12590 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
125a0 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
125b0 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
125c0 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
125d0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
125e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
125f0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
12600 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
12610 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
12620 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
12630 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
12640 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
12650 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
12660 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
12670 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
12680 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12690 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
126a0 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
126b0 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
126c0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
126d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
126e0 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
126f0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
12700 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
12710 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
12720 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
12730 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
12740 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
12750 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
12760 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
12770 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12780 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12790 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
127a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
127b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
127c0 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
127d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
127e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
127f0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
12800 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
12810 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
12820 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
12840 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12850 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
12860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12870 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
12880 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12890 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
128a0 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
128b0 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
128c0 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
128d0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
128e0 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
128f0 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
12900 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
12910 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
12920 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
12930 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12940 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
12950 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
12960 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12970 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
12980 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
12990 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
129a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
129b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
129c0 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
129d0 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
129e0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
129f0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
12a00 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
12a10 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12a20 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
12a30 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
12a40 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
12a50 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
12a60 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
12a70 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
12a80 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
12a90 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
12aa0 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
12ab0 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
12ac0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
12ad0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
12ae0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
12af0 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
12b00 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
12b10 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
12b20 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
12b30 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
12b40 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
12b50 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
12b60 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
12b70 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
12b80 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
12b90 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
12ba0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
12bb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
12bc0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
12bd0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
12be0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12bf0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
12c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
12c10 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
12c20 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
12c30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
12c40 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
12c50 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
12c60 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
12c70 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
12c80 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
12c90 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
12ca0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
12cb0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
12cc0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
12cd0 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
12ce0 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
12cf0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
12d00 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
12d10 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
12d20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
12d30 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
12d40 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
12d50 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
12d60 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
12d70 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
12d80 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
12d90 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
12da0 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
12db0 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
12dc0 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
12dd0 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
12de0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
12df0 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
12e00 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
12e10 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
12e20 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
12e30 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
12e40 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
12e50 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
12e60 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
12e70 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
12e80 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
12e90 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
12ea0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
12eb0 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65  tmt_busy((sqlite
12ec0 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20  3_stmt*)p) ){.  
12ed0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
12ee0 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
12ef0 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
12f00 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73        if( p->bIs
12f10 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b  Reader ) nRead++
12f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
12f30 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
12f40 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
12f50 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a  >nVdbeActive );.
12f60 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
12f70 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ==db->nVdbeWrite
12f80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52   );.  assert( nR
12f90 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ead==db->nVdbeRe
12fa0 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ad );.}.#else.#d
12fb0 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
12fc0 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
12fd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
12fe0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
12ff0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
13000 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
13010 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
13020 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
13030 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
13040 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
13050 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
13060 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
13070 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
13080 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
13090 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
130a0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
130b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
130c0 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
130d0 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
130e0 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
130f0 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
13100 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
13110 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
13120 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
13130 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
13140 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
13150 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13160 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
13170 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
13180 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
13190 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f  LINE int vdbeClo
131a0 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
131b0 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
131c0 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
131d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
131e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
131f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
13200 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
13210 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
13220 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t-1;..  assert( 
13230 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
13240 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
13250 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
13260 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  E);.  assert( db
13270 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
13280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
13290 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
132a0 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
132b0 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
132c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
132d0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
132e0 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
132f0 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  _OK;.    Btree *
13300 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
13310 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
13320 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  t ){.      if( e
13330 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
13340 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
13350 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
13360 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
13370 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
13380 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
13390 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
133a0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
133b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
133c0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
133d0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
133e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
133f0 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
13400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13420 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13430 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
13440 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53    }.  }.  db->nS
13450 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d  tatement--;.  p-
13460 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
13470 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
13480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
13490 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
134a0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
134b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
134c0 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
134d0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
134e0 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
134f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
13500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13510 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13520 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
13530 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
13540 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
13550 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
13560 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
13570 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
13580 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
13590 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
135a0 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ore the .  ** da
135b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
135c0 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
135d0 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
135e0 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
135f0 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74  hen .  ** the st
13600 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
13610 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
13620 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53   */.  if( eOp==S
13630 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13640 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  K ){.    db->nDe
13650 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
13660 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
13670 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
13680 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
13690 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d  tDefImmCons;.  }
136a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
136b0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
136c0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
136d0 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
136e0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53  .  if( p->db->nS
136f0 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
13700 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
13710 20 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73   return vdbeClos
13720 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f  eStatement(p, eO
13730 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
13740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
13750 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13760 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
13770 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
13780 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
13790 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
137a0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
137b0 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
137c0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
137d0 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
137e0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
137f0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
13800 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
13810 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
13820 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
13830 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
13840 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
13850 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
13860 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
13870 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
13880 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
13890 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
138a0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
138b0 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
138c0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
138d0 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
138e0 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
138f0 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  EY.** and write 
13900 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
13910 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
13920 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
13930 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13940 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
13950 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
13960 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
13970 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
13980 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
13990 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
139a0 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64   (deferred && (d
139b0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
139c0 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d  +db->nDeferredIm
139d0 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c  mCons)>0) .   ||
139e0 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
139f0 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
13a00 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  0) .  ){.    p->
13a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
13a20 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
13a30 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  Y;.    p->errorA
13a40 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
13a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13a60 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49  eError(p, "FOREI
13a70 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
13a80 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
13a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13aa0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
13ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
13ac0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
13ad0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13ae0 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
13af0 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
13b00 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
13b10 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
13b20 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
13b30 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
13b40 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
13b50 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
13b60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
13b70 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
13b80 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
13b90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13ba0 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
13bb0 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
13bc0 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
13bd0 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
13be0 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
13bf0 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
13c00 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
13c10 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
13c20 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
13c30 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
13c40 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
13c50 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
13c60 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
13c70 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
13c80 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
13c90 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
13ca0 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
13cb0 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
13cc0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
13cd0 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
13ce0 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
13cf0 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
13d00 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
13d10 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
13d20 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
13d30 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
13d60 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
13d70 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
13d80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
13d90 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
13da0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
13db0 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
13dc0 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
13dd0 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
13de0 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
13df0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
13e00 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
13e10 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
13e20 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
13e30 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
13e40 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
13e50 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
13e60 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
13e70 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
13e80 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
13e90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
13ea0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
13eb0 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
13ec0 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
13ed0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
13ee0 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
13ef0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
13f00 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
13f10 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
13f20 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
13f30 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
13f40 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
13f50 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
13f60 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
13f70 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
13f80 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
13f90 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
13fa0 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
13fb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
13fc0 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d    */..  if( p->m
13fd0 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
13fe0 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
13ff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14000 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
14010 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14020 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
14030 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
14040 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
14050 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  (p);.  checkActi
14060 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
14070 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
14080 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
14090 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
140a0 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
140b0 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
140c0 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
140d0 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
140e0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
140f0 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
14100 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
14110 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
14120 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
14130 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
14140 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
14150 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
14160 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
14170 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
14180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
14190 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
141a0 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
141b0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
141c0 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
141d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
141e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
141f0 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
14200 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
14210 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
14220 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
14230 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
14240 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
14250 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
14260 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
14270 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
142a0 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
142b0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
142c0 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
142d0 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
142e0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
142f0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
14300 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
14310 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
14320 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
14330 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
14340 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
14350 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
14360 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
14370 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
14380 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
14390 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
143a0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
143b0 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
143c0 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
143d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
143e0 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
143f0 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
14400 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
14410 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
14420 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
14430 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
14440 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
14450 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
14460 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
14470 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69  curred while wri
14480 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
14490 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
144a0 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
144b0 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
144c0 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
144d0 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
144e0 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
144f0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
14500 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
14510 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
14520 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
14530 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
14540 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
14550 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
14560 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
14570 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
14580 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
14590 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
145a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
145b0 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
145c0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
145d0 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
145e0 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
145f0 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
14600 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
14610 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
14620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14630 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
14640 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
14650 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
14660 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
14670 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
14680 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
14690 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
146a0 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
146b0 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
146c0 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
146d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
146e0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
146f0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
14700 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
14710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
14720 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
14730 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
14740 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
14750 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
14760 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14780 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
14790 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
147a0 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
147b0 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
147c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
147d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
147e0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
147f0 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
14800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
14810 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
14820 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
14830 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
14840 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
14850 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
14860 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
14870 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
14880 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
14890 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
148a0 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
148b0 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
148c0 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
148d0 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
148e0 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
148f0 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
14900 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
14910 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
14920 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
14930 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
14940 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
14950 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
14960 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
14970 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14980 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
14990 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
149a0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
149b0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
149c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
149d0 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
149e0 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
149f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14a00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
14a10 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
14a20 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
14a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14a40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
14a50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14a60 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
14a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
14a90 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
14aa0 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
14ab0 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
14ac0 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
14ad0 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
14ae0 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
14af0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
14b00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
14b10 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
14b20 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
14b30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
14b40 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
14b50 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
14b60 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
14b70 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
14b80 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
14b90 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
14ba0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
14bb0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
14bc0 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
14bd0 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
14be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14bf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
14c00 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
14c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14c20 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
14c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14c40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
14c50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
14c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
14c80 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
14c90 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
14ca0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
14cb0 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  E_OK);.         
14cc0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14cd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14ce0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
14cf0 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
14d00 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
14d10 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
14d20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
14d30 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
14d40 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20  ITE_DeferFKs;.  
14d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
14d60 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
14d70 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
14d80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
14d90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14da0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14db0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
14dc0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
14dd0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14de0 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
14df0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
14e00 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
14e10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
14e20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14e30 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
14e40 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
14e50 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
14e60 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
14e70 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
14e80 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
14e90 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
14ea0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
14eb0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
14ec0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
14ed0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
14ef0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
14f00 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
14f10 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
14f20 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
14f30 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
14f40 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14f50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
14f60 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14f80 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
14f90 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
14fa0 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
14fb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
14fc0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
14fd0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
14fe0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
14ff0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
15000 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
15010 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
15020 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
15030 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
15040 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
15050 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
15060 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
15070 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
15080 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
15090 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
150a0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
150b0 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
150c0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
150d0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
150e0 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
150f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
15100 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
15110 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
15120 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
15130 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
15140 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
15150 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
15160 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
15170 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
15180 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
15190 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
151a0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
151b0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
151c0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
151d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
151e0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
151f0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
15200 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
15210 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
15220 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
15230 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
15240 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
15250 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
15260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15270 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
15280 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
15290 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
152a0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
152b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
152c0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
152d0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
152e0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
152f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
15300 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
15310 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
15320 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
15330 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
15340 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
15350 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
15360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
15370 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
15380 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
15390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
153a0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
153b0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
153c0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
153d0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
153e0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
153f0 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
15400 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
15410 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
15420 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
15430 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
15440 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
15450 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
15460 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
15470 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
15480 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
15490 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
154a0 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
154b0 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
154c0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
154d0 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
154e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
154f0 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
15500 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
15510 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
15520 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
15530 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
15540 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
15550 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
15560 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
15570 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
15580 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
15590 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62  nt(db);.  if( db
155a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
155b0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
155c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
155d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
155e0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
155f0 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
15600 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
15610 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
15620 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
15630 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
15640 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
15650 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
15660 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
15670 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
15680 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
15690 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
156a0 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
156b0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
156c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
156d0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
156e0 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
156f0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
15700 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  tive>0 || db->au
15710 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
15720 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
15730 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
15740 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
15750 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
15760 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
15770 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
15780 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
15790 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
157a0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
157b0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
157c0 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
157d0 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
157e0 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
157f0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
15800 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
15810 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
15820 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
15830 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15840 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f  ** Copy the erro
15850 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
15860 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69   message belongi
15870 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70  ng to the VDBE p
15880 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
15890 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
158a0 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68  o its database h
158b0 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74  andle (so that t
158c0 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  hey will be .** 
158d0 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c  returned by call
158e0 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72  s to sqlite3_err
158f0 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74  code() and sqlit
15900 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a  e3_errmsg())..**
15910 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
15920 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72  n does not clear
15930 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20   the VDBE error 
15940 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c  code or message,
15950 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20   just.** copies 
15960 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61  them to the data
15970 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
15980 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54  int sqlite3VdbeT
15990 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62  ransferError(Vdb
159a0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
159b0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
159c0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
159d0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
159e0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e   ){.    db->bBen
159f0 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20  ignMalloc++;.   
15a00 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
15a10 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15a20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30   if( db->pErr==0
15a30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71   ) db->pErr = sq
15a40 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
15a50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
15a60 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
15a70 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
15a80 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
15a90 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
15aa0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  T);.    sqlite3E
15ab0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
15ac0 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  ;.    db->bBenig
15ad0 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c  nMalloc--;.  }el
15ae0 73 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20  se if( db->pErr 
15af0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
15b00 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70  lueSetNull(db->p
15b10 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Err);.  }.  db->
15b20 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
15b30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
15b40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15b50 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20  LE_SQLLOG./*.** 
15b60 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  If an SQLITE_CON
15b70 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20  FIG_SQLLOG hook 
15b80 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e  is registered an
15b90 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
15ba0 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b  n run, .** invok
15bb0 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
15bc0 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53  void vdbeInvokeS
15bd0 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a  qllog(Vdbe *v){.
15be0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
15bf0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
15c00 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49  g && v->rc==SQLI
15c10 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c  TE_OK && v->zSql
15c20 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && v->pc>=0 ){.
15c30 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e      char *zExpan
15c40 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ded = sqlite3Vdb
15c50 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d  eExpandSql(v, v-
15c60 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65  >zSql);.    asse
15c70 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e  rt( v->db->init.
15c80 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69  busy==0 );.    i
15c90 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a  f( zExpanded ){.
15ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
15cb0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
15cc0 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g(.          sql
15cd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15ce0 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e  .pSqllogArg, v->
15cf0 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31  db, zExpanded, 1
15d00 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
15d10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
15d20 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b  >db, zExpanded);
15d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
15d40 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
15d50 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a  InvokeSqllog(x).
15d60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
15d70 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
15d80 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
15d90 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
15da0 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
15db0 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
15dc0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
15dd0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
15de0 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
15df0 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
15e00 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
15e10 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
15e20 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
15e30 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
15e40 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
15e50 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
15e60 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
15e70 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
15e80 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
15e90 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
15ea0 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
15eb0 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
15ec0 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
15ed0 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
15ee0 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
15ef0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
15f00 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
15f10 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
15f20 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
15f30 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
15f40 74 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  t i;.#endif..  s
15f50 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
15f60 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
15f70 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
15f80 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
15f90 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
15fa0 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
15fb0 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
15fc0 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
15fd0 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
15fe0 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
15ff0 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
16000 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
16010 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
16020 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
16030 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
16040 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
16050 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
16060 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
16070 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
16080 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
16090 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
160a0 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
160b0 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
160c0 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
160d0 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
160e0 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
160f0 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
16100 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
16110 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
16120 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
16130 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
16140 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16150 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
16160 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
16170 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
16180 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
16190 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
161a0 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
161b0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
161c0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
161d0 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
161e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
161f0 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
16200 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
16210 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
16220 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
16230 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
16240 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
16250 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
16260 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
16270 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
16280 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
16290 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
162a0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
162b0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
162c0 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d  sg(db, p->rc, p-
162d0 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20  >zErrMsg ? "%s" 
162e0 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  : 0, p->zErrMsg)
162f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65  ;.  }..  /* Rese
16300 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65  t register conte
16310 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20  nts and reclaim 
16320 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65  error message me
16330 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  mory..  */.#ifde
16340 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
16350 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
16360 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
16370 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
16380 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
16390 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
163a0 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
163b0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
163c0 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
163d0 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
163e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
163f0 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
16400 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
16410 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
16420 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
16430 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
16440 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
16450 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
16460 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20  M_Undefined );. 
16470 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
16480 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16490 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
164a0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
164b0 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
164c0 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
164d0 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
164e0 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
164f0 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
16500 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
16510 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
16520 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
16530 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
16540 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
16550 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
16560 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
16570 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
16580 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
16590 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
165a0 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
165b0 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
165c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
165d0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
165e0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
165f0 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
16600 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
16610 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
16620 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
16630 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
16640 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
16650 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
16660 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
16670 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
16680 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
16690 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
166a0 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
166b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
166c0 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
166d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
166e0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
166f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
16700 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
16710 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
16720 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
16730 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
16740 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
16750 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
16760 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
16770 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
16780 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
16790 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
167a0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
167b0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
167c0 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
167d0 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
167e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
167f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
16800 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
16810 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
16820 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
16830 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
16840 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
16850 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
16860 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ndif.  p->magic 
16870 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53  = VDBE_MAGIC_RES
16880 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  ET;.  return p->
16890 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
168a0 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
168b0 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
168c0 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
168d0 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
168e0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
168f0 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
16900 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
16910 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
16920 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
16930 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
16940 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
16950 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
16960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16970 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
16980 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
16990 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
169a0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
169b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
169c0 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
169d0 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
169e0 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
169f0 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
16a00 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
16a10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16a20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
16a30 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
16a40 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
16a50 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
16a60 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
16a70 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
16a80 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
16a90 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
16aa0 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
16ab0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
16ac0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
16ad0 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
16ae0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
16af0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
16b00 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
16b10 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
16b20 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
16b30 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
16b40 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
16b50 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
16b60 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
16b70 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
16b80 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
16b90 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
16ba0 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
16bb0 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
16bc0 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
16bd0 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
16be0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
16bf0 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
16c00 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
16c10 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
16c20 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
16c30 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
16c40 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
16c50 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
16c60 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
16c70 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
16c80 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
16c90 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69  orresponds to bi
16ca0 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f  t 0 etc.)..*/.vo
16cb0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
16cc0 6c 65 74 65 41 75 78 44 61 74 61 28 73 71 6c 69  leteAuxData(sqli
16cd0 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61 74 61  te3 *db, AuxData
16ce0 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20   **pp, int iOp, 
16cf0 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69  int mask){.  whi
16d00 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41  le( *pp ){.    A
16d10 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a  uxData *pAux = *
16d20 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70  pp;.    if( (iOp
16d30 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75  <0).     || (pAu
16d40 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20  x->iAuxOp==iOp. 
16d50 20 20 20 20 20 20 20 20 20 26 26 20 70 41 75 78           && pAux
16d60 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20 20 20  ->iAuxArg>=0.   
16d70 20 20 20 20 20 20 20 26 26 20 28 70 41 75 78 2d         && (pAux-
16d80 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c 20 21  >iAuxArg>31 || !
16d90 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
16da0 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 29  2(pAux->iAuxArg)
16db0 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
16dc0 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
16dd0 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a  >iAuxArg==31 );.
16de0 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
16df0 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a 20 20  xDeleteAux ){.  
16e00 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
16e10 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70 41 75  eteAux(pAux->pAu
16e20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
16e30 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
16e40 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20 73 71  extAux;.      sq
16e50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16e60 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
16e70 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
16e80 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20  x->pNextAux;.   
16e90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
16ea0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
16eb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16ec0 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
16ed0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
16ee0 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70  gument,.** excep
16ef0 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73  t for object its
16f00 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72  elf, which is pr
16f10 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eserved..**.** T
16f20 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
16f30 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
16f40 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56  ion and sqlite3V
16f50 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74  dbeDelete() is t
16f60 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74  hat.** VdbeDelet
16f70 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73  e() also unlinks
16f80 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
16f90 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61  he list of VMs a
16fa0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
16fb0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
16fc0 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72  onnection and fr
16fd0 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ees the object i
16fe0 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tself..*/.void s
16ff0 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
17000 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
17010 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53  b, Vdbe *p){.  S
17020 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c  ubProgram *pSub,
17030 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72   *pNext;.  asser
17040 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
17050 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
17060 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
17070 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
17080 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
17090 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
170a0 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
170b0 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
170c0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
170d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
170e0 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
170f0 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
17100 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
17110 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
17120 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ub);.  }.  if( p
17130 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
17140 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
17150 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
17160 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
17170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
17180 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69  Free(db, p->pVLi
17190 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
171a0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
171b0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65  ree);.  }.  vdbe
171c0 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
171d0 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
171e0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
171f0 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
17200 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
17210 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
17220 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17230 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
17240 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e  TATUS.  {.    in
17250 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
17260 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b  ; i<p->nScan; i+
17270 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
17280 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
17290 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
172a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
172b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
172c0 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Scan);.  }.#endi
172d0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
172e0 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
172f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17300 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
17310 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
17320 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
17330 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
17340 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
17350 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17360 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
17370 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
17380 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
17390 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66  ect(db, p);.  if
173a0 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
173b0 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
173c0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
173d0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
173e0 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
173f0 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
17400 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
17410 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
17420 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
17430 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
17440 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
17450 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
17460 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
17470 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
17480 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  eNN(db, p);.}../
17490 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
174a0 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e  "p" has a pendin
174b0 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  g seek operation
174c0 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
174d0 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65  t been.** carrie
174e0 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65  d out.  Seek the
174f0 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66   cursor now.  If
17500 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
17510 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
17520 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
17530 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
17540 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
17550 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65  NLINE handleDefe
17560 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43  rredMoveto(VdbeC
17570 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
17580 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
17590 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
175a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
175b0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
175c0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
175d0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
175e0 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  to );.  assert( 
175f0 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
17600 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
17610 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
17620 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  EE );.  rc = sql
17630 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
17640 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43  npacked(p->uc.pC
17650 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
17660 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
17670 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
17680 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
17690 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
176a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
176b0 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
176c0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
176d0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
176e0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
176f0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
17700 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
17710 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
17720 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
17730 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17740 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
17750 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
17760 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
17770 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
17780 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
17790 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
177a0 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
177b0 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
177c0 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
177d0 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
177e0 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
177f0 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
17800 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
17810 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
17820 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
17830 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
17840 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
17850 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
17860 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
17870 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
17880 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
17890 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
178a0 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
178b0 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
178c0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
178d0 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
178e0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
178f0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
17900 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
17910 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75  ssert( p->uc.pCu
17920 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
17930 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
17940 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
17950 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
17960 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17970 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
17980 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  re(p->uc.pCursor
17990 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
179a0 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
179b0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
179c0 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
179d0 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
179e0 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
179f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17a00 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
17a10 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
17a20 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
17a30 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
17a40 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
17a50 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
17a60 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
17a70 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
17a80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17a90 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
17aa0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
17ab0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
17ac0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
17ad0 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71  TREE );.  if( sq
17ae0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17af0 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
17b00 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
17b10 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
17b20 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
17b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
17b50 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
17b60 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
17b70 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
17b80 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
17b90 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
17ba0 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
17bb0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
17bc0 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
17bd0 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
17be0 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
17bf0 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
17c00 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
17c10 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
17c20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
17c30 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
17c40 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
17c50 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
17c60 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
17c70 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
17c80 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
17c90 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
17ca0 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
17cb0 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
17cc0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
17cd0 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
17ce0 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
17cf0 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
17d00 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
17d10 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
17d20 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
17d30 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
17d40 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
17d50 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
17d60 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
17d70 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
17d80 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
17d90 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
17da0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
17db0 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
17dc0 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e  eCursor **pp, in
17dd0 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62  t *piCol){.  Vdb
17de0 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70  eCursor *p = *pp
17df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
17e00 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
17e10 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43 75  _BTREE || p->eCu
17e20 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50  rType==CURTYPE_P
17e30 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20 70  SEUDO );.  if( p
17e40 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
17e50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61 70   ){.    int iMap
17e60 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c  ;.    if( p->aAl
17e70 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20  tMap && (iMap = 
17e80 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69  p->aAltMap[1+*pi
17e90 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20  Col])>0 ){.     
17ea0 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75   *pp = p->pAltCu
17eb0 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69 43  rsor;.      *piC
17ec0 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20  ol = iMap - 1;. 
17ed0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17ee0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
17ef0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
17f00 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
17f10 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
17f20 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
17f30 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
17f40 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  sor) ){.    retu
17f50 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  rn handleMovedCu
17f60 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72  rsor(p);.  }.  r
17f70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
17f90 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
17fa0 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
17fb0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
17fc0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
17fd0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
17fe0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
17ff0 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
18000 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
18010 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
18020 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
18030 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
18040 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
18050 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
18060 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
18070 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
18080 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
18090 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
180a0 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
180b0 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
180c0 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
180d0 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
180e0 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
180f0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
18100 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
18110 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
18120 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
18130 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
18140 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
18150 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
18160 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
18170 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
18180 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
18190 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
181a0 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
181b0 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
181c0 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
181d0 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
181e0 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
181f0 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
18200 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
18210 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
18220 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
18230 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
18240 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
18250 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72   data blob separ
18260 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
18270 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
18280 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
18290 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
182a0 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
182b0 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
182c0 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
182d0 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
182e0 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
182f0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
18300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
18310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
18320 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
18340 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
18350 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
18360 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
18370 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
18380 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
18390 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
183a0 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
183b0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
183c0 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183e0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
183f0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
18400 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
18410 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
18420 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
18430 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18450 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
18460 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
18470 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
18490 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
184a0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
184b0 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
184c0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
184d0 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
184e0 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
18500 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
18510 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
18520 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
18540 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
18550 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
18560 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
18590 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
185a0 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
185b0 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
185c0 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
185d0 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
185e0 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
185f0 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
18600 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
18610 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
18620 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
18630 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
18640 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
18650 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
18660 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
18670 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
18680 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
18690 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
186a0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
186b0 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
186c0 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
186d0 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
186e0 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
186f0 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65  format, u32 *pLe
18700 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  n){.  int flags 
18710 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
18720 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72   u32 n;..  asser
18730 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20  t( pLen!=0 );.  
18740 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
18750 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20  ll ){.    *pLen 
18760 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
18770 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
18780 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
18790 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
187a0 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
187b0 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
187c0 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
187d0 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
187e0 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
187f0 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
18800 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
18810 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
18820 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
18830 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c   u = ~i;.    }el
18840 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b  se{.      u = i;
18850 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
18860 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69  <=127 ){.      i
18870 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66  f( (i&1)==i && f
18880 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
18890 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d  .        *pLen =
188a0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
188b0 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20  rn 8+(u32)u;.   
188c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
188d0 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20    *pLen = 1;.   
188e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
188f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18900 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b   if( u<=32767 ){
18910 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75   *pLen = 2; retu
18920 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 2; }.    if( 
18930 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70  u<=8388607 ){ *p
18940 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20  Len = 3; return 
18950 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  3; }.    if( u<=
18960 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70  2147483647 ){ *p
18970 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20  Len = 4; return 
18980 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  4; }.    if( u<=
18990 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c  MAX_6BYTE ){ *pL
189a0 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35  en = 6; return 5
189b0 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20  ; }.    *pLen = 
189c0 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  8;.    return 6;
189d0 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
189e0 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
189f0 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20   *pLen = 8;.    
18a00 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
18a10 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
18a20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
18a30 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
18a40 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
18a50 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
18a60 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32  =0 );.  n = (u32
18a70 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20  )pMem->n;.  if( 
18a80 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
18a90 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
18aa0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
18ab0 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72    *pLen = n;.  r
18ac0 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
18ad0 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
18ae0 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
18af0 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f  .** The sizes fo
18b00 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c  r serial types l
18b10 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a  ess than 128.*/.
18b20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
18b30 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
18b40 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Sizes[] = {.    
18b50 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20      /*  0   1   
18b60 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20  2   3   4   5   
18b70 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f  6   7   8   9 */
18b80 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20     ./*   0 */   
18b90 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20  0,  1,  2,  3,  
18ba0 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20  4,  6,  8,  8,  
18bb0 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f  0,  0,./*  10 */
18bc0 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
18bd0 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32  ,  1,  1,  2,  2
18be0 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30  ,  3,  3,./*  20
18bf0 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c   */   4,  4,  5,
18c00 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c    5,  6,  6,  7,
18c10 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20    7,  8,  8,./* 
18c20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20   30 */   9,  9, 
18c30 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20  10, 10, 11, 11, 
18c40 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a  12, 12, 13, 13,.
18c50 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31  /*  40 */  14, 1
18c60 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31  4, 15, 15, 16, 1
18c70 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31  6, 17, 17, 18, 1
18c80 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39  8,./*  50 */  19
18c90 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31  , 19, 20, 20, 21
18ca0 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33  , 21, 22, 22, 23
18cb0 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20  , 23,./*  60 */ 
18cc0 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c   24, 24, 25, 25,
18cd0 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c   26, 26, 27, 27,
18ce0 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20   28, 28,./*  70 
18cf0 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20  */  29, 29, 30, 
18d00 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20  30, 31, 31, 32, 
18d10 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20  32, 33, 33,./*  
18d20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33  80 */  34, 34, 3
18d30 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33  5, 35, 36, 36, 3
18d40 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f  7, 37, 38, 38,./
18d50 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39  *  90 */  39, 39
18d60 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31  , 40, 40, 41, 41
18d70 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33  , 42, 42, 43, 43
18d80 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c  ,./* 100 */  44,
18d90 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c   44, 45, 45, 46,
18da0 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c   46, 47, 47, 48,
18db0 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20   48,./* 110 */  
18dc0 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20  49, 49, 50, 50, 
18dd0 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20  51, 51, 52, 52, 
18de0 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a  53, 53,./* 120 *
18df0 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35  /  54, 54, 55, 5
18e00 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35  5, 56, 56, 57, 5
18e10 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  7.};../*.** Retu
18e20 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
18e30 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
18e40 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
18e50 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
18e60 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ype..*/.u32 sqli
18e70 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
18e80 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
18e90 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
18ea0 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b  ial_type>=128 ){
18eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
18ec0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
18ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
18ee0 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
18ef0 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20  <12 .           
18f00 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   || sqlite3Small
18f10 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
18f20 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f  _type]==(serial_
18f30 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a  type - 12)/2 );.
18f40 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
18f50 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
18f60 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
18f70 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56   }.}.u8 sqlite3V
18f80 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c  dbeOneByteSerial
18f90 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61  TypeLen(u8 seria
18fa0 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72  l_type){.  asser
18fb0 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  t( serial_type<1
18fc0 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  28 );.  return s
18fd0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18fe0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
18ff0 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ];  .}../*.** If
19000 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
19010 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
19020 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
19030 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
19040 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
19050 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
19060 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
19070 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
19080 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
19090 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
190a0 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
190b0 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
190c0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
190d0 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
190e0 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
190f0 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
19100 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
19110 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
19120 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
19130 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
19140 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
19150 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
19160 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
19170 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
19180 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
19190 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
191a0 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
191b0 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
191c0 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
191d0 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
191e0 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
191f0 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
19200 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
19210 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
19220 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
19230 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
19240 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
19250 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
19260 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
19270 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
19280 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
19290 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
192a0 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
192b0 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
192c0 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
192d0 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
192e0 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
192f0 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
19300 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
19310 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
19320 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
19330 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
19340 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
19350 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
19360 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
19370 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
19380 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19390 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
193a0 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
193b0 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
193c0 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
193d0 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
193e0 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
193f0 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
19400 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
19410 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
19420 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
19430 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
19440 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
19450 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
19460 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
19470 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
19480 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
19490 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
194a0 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
194b0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
194c0 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
194d0 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
194e0 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
194f0 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
19500 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
19510 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
19520 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
19530 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
19540 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
19550 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
19560 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
19570 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
19580 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
19590 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
195a0 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
195b0 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
195c0 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
195d0 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
195e0 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
195f0 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
19600 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
19610 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
19620 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
19630 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
19640 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
19650 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
19660 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
19670 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
19680 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
19690 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
196a0 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
196b0 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
196c0 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
196d0 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
196e0 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
196f0 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
19700 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
19710 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
19720 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
19730 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
19740 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
19750 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19760 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
19770 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
19780 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
19790 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
197a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
197b0 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
197c0 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
197d0 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
197e0 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
197f0 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
19800 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
19810 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
19820 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
19830 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
19840 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19850 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
19860 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
19870 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
19880 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
19890 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
198a0 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72  sponsible.** for
198b0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75   allocating enou
198c0 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b  gh space to buf[
198d0 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  ] to hold the en
198e0 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c  tire field, excl
198f0 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20  usive.** of the 
19900 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79  pMem->u.nZero by
19910 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65  tes for a MEM_Ze
19920 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ro value..**.** 
19930 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
19940 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
19950 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
19960 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
19970 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
19980 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
19990 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
199a0 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
199b0 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
199c0 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
199d0 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
199e0 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
199f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
19a00 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a  t(u8 *buf, Mem *
19a10 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c  pMem, u32 serial
19a20 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65  _type){.  u32 le
19a30 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
19a40 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
19a50 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
19a60 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
19a70 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
19a80 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20  .    u32 i;.    
19a90 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
19aa0 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
19ab0 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73  rt( sizeof(v)==s
19ac0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
19ad0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
19ae0 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c  (&v, &pMem->u.r,
19af0 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
19b00 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
19b10 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
19b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
19b30 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
19b40 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
19b50 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
19b60 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
19b70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e];.    assert( 
19b80 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  i>0 );.    do{. 
19b90 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20       buf[--i] = 
19ba0 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
19bb0 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
19bc0 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20   }while( i );.  
19bd0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
19be0 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
19bf0 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
19c00 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
19c10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19c20 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
19c30 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
19c40 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
19c50 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
19c60 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
19c70 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
19c80 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
19c90 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
19ca0 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  ->n;.    if( len
19cb0 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c  >0 ) memcpy(buf,
19cc0 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
19cd0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
19ce0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
19cf0 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
19d00 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
19d10 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78  ;.}../* Input "x
19d20 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20  " is a sequence 
19d30 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  of unsigned char
19d40 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72  acters that repr
19d50 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65  esent a.** big-e
19d60 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ndian integer.  
19d70 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76  Return the equiv
19d80 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74  alent native int
19d90 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  eger.*/.#define 
19da0 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  ONE_BYTE_INT(x) 
19db0 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a     ((i8)(x)[0]).
19dc0 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45  #define TWO_BYTE
19dd0 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a  _INT(x)    (256*
19de0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29  (i8)((x)[0])|(x)
19df0 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52  [1]).#define THR
19e00 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  EE_BYTE_INT(x)  
19e10 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b  (65536*(i8)((x)[
19e20 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c  0])|((x)[1]<<8)|
19e30 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[2]).#define 
19e40 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78  FOUR_BYTE_UINT(x
19e50 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d  )  (((u32)(x)[0]
19e60 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  <<24)|((x)[1]<<1
19e70 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
19e80 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[3]).#define F
19e90 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  OUR_BYTE_INT(x) 
19ea0 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28  (16777216*(i8)((
19eb0 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
19ec0 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
19ed0 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44  (x)[3])../*.** D
19ee0 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
19ef0 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
19f00 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
19f10 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
19f20 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
19f30 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
19f40 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
19f50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
19f60 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  es read..**.** T
19f70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19f80 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74  implemented as t
19f90 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74  wo separate rout
19fa0 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d  ines for perform
19fb0 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77  ance..** The few
19fc0 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75   cases that requ
19fd0 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  ire local variab
19fe0 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f  les are broken o
19ff0 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61  ut into a separa
1a000 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f  te.** routine so
1a010 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61   that in most ca
1a020 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64  ses the overhead
1a030 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73   of moving the s
1a040 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  tack pointer.** 
1a050 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a  is avoided..*/ .
1a060 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54  static u32 SQLIT
1a070 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61  E_NOINLINE seria
1a080 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
1a090 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
1a0a0 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
1a0b0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
1a0c0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
1a0d0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
1a0e0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1a0f0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
1a100 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
1a110 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
1a120 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
1a130 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
1a140 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
1a150 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f  .  u64 x = FOUR_
1a160 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a  BYTE_UINT(buf);.
1a170 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42    u32 y = FOUR_B
1a180 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b  YTE_UINT(buf+4);
1a190 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b  .  x = (x<<32) +
1a1a0 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c   y;.  if( serial
1a1b0 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
1a1c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a1d0 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61  R-29851-52272 Va
1a1e0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1a1f0 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  ian 64-bit.    *
1a200 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a210 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a220 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
1a230 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65  i64*)&x;.    pMe
1a240 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a250 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  nt;.    testcase
1a260 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a270 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1a280 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a290 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75  57343-49114 Valu
1a2a0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a2b0 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20  n IEEE 754-2008 
1a2c0 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c  64-bit.    ** fl
1a2d0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
1a2e0 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66  ber. */.#if !def
1a2f0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
1a300 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1a310 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1a320 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69  INT).    /* Veri
1a330 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
1a340 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
1a350 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
1a360 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62  he same.    ** b
1a370 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
1a380 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
1a390 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
1a3a0 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a  T_FLOAT is.    *
1a3b0 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
1a3c0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
1a3d0 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
1a3e0 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
1a3f0 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
1a400 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
1a410 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
1a420 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
1a430 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  32;.    static c
1a440 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
1a450 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32   1.0;.    u64 t2
1a460 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d   = t1;.    swapM
1a470 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1a480 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t2);.    assert(
1a490 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
1a4a0 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
1a4b0 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
1a4c0 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
1a4d0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
1a4e0 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
1a4f0 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e   sizeof(pMem->u.
1a500 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61  r)==8 );.    swa
1a510 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1a520 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  t(x);.    memcpy
1a530 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c  (&pMem->u.r, &x,
1a540 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
1a550 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
1a560 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
1a570 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  ->u.r) ? MEM_Nul
1a580 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
1a590 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a  }.  return 8;.}.
1a5a0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1a5b0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
1a5c0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1a5d0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
1a5e0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
1a5f0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
1a600 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
1a610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1a620 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
1a630 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
1a640 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
1a650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1a660 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
1a670 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
1a680 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
1a690 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1a6a0 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
1a6b0 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
1a6c0 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
1a6d0 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
1a6e0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1a6f0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
1a700 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a   0: {  /* Null *
1a710 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a720 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d  NCE-OF: R-24078-
1a730 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61  09375 Value is a
1a740 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20   NULL. */.      
1a750 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a760 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
1a770 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1a780 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f  ase 1: {.      /
1a790 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a7a0 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c  -44885-25196 Val
1a7b0 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74  ue is an 8-bit t
1a7c0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20  wos-complement. 
1a7d0 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
1a7e0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1a7f0 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  u.i = ONE_BYTE_I
1a800 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1a810 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1a820 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1a830 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1a840 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1a850 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
1a860 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
1a870 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1a880 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1a890 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37  IDENCE-OF: R-497
1a8a0 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69  94-35026 Value i
1a8b0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31  s a big-endian 1
1a8c0 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  6-bit.      ** t
1a8d0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1a8e0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1a8f0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f   pMem->u.i = TWO
1a900 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1a910 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a920 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1a930 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1a940 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1a950 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
1a960 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
1a970 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
1a980 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1a990 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a9a0 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20  : R-37839-54301 
1a9b0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1a9c0 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20  ndian 24-bit.   
1a9d0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1a9e0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1a9f0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1aa00 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  i = THREE_BYTE_I
1aa10 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1aa20 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1aa30 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1aa40 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1aa50 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1aa60 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
1aa70 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
1aa80 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1aa90 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1aaa0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38  IDENCE-OF: R-018
1aab0 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69  49-26079 Value i
1aac0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33  s a big-endian 3
1aad0 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  2-bit.      ** t
1aae0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1aaf0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1ab00 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
1ab10 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  R_BYTE_INT(buf);
1ab20 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20  .#ifdef __HP_cc 
1ab30 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61  .      /* Work a
1ab40 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74  round a sign-ext
1ab50 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68  ension bug in th
1ab60 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f  e HP compiler fo
1ab70 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20  r HP/UX */.     
1ab80 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30   if( buf[0]&0x80
1ab90 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20   ) pMem->u.i |= 
1aba0 30 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30  0xffffffff800000
1abb0 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  00LL;.#endif.   
1abc0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1abd0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1abe0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1abf0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1ac00 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
1ac10 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
1ac20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
1ac30 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1ac40 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1ac50 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c  -50385-09674 Val
1ac60 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1ac70 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20  an 48-bit.      
1ac80 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1ac90 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1aca0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1acb0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1acc0 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29  buf+2) + (((i64)
1acd0 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1ace0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1acf0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1ad00 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1ad10 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1ad20 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1ad30 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
1ad40 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
1ad50 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1ad60 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
1ad70 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
1ad80 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
1ad90 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73       /* These us
1ada0 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
1adb0 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e  s, so do them in
1adc0 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74   a separate rout
1add0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ine.      ** to 
1ade0 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20  avoid having to 
1adf0 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70  move the frame p
1ae00 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f  ointer in the co
1ae10 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
1ae20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c     return serial
1ae30 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74  Get(buf,serial_t
1ae40 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ype,pMem);.    }
1ae50 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
1ae60 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
1ae70 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
1ae80 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
1ae90 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1aea0 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38  -OF: R-12976-228
1aeb0 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  93 Value is the 
1aec0 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20  integer 0. */.  
1aed0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1aee0 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32  OF: R-18143-1212
1aef0 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  1 Value is the i
1af00 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20  nteger 1. */.   
1af10 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
1af20 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
1af30 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1af40 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1af50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1af60 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1af70 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1af80 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31  E-OF: R-14606-31
1af90 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42  564 Value is a B
1afa0 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31  LOB that is (N-1
1afb0 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20  2)/2 bytes in.  
1afc0 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20      ** length.. 
1afd0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
1afe0 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31  -OF: R-28401-001
1aff0 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74  40 Value is a st
1b000 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74  ring in the text
1b010 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20   encoding and.  
1b020 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20      ** (N-13)/2 
1b030 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
1b040 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
1b050 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67   const u16 aFlag
1b060 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c  [] = { MEM_Blob|
1b070 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53  MEM_Ephem, MEM_S
1b080 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a  tr|MEM_Ephem };.
1b090 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
1b0a0 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
1b0b0 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65     pMem->n = (se
1b0c0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
1b0d0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1b0e0 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61  gs = aFlag[seria
1b0f0 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20  l_type&1];.     
1b100 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b   return pMem->n;
1b110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b120 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54  urn 0;.}./*.** T
1b130 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1b140 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
1b150 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1b160 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64   for an Unpacked
1b170 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
1b180 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ure large enough
1b190 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
1b1a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1b1b0 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a  rdUnpack() if.**
1b1c0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1b1d0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
1b1e0 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75   to KeyInfo stru
1b1f0 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a  cture pKeyInfo..
1b200 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20  **.** The space 
1b210 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61  is either alloca
1b220 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
1b230 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f  3DbMallocRaw() o
1b240 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a  r from within.**
1b250 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62   the unaligned b
1b260 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61  uffer passed via
1b270 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   the second and 
1b280 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20  third arguments 
1b290 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73  (presumably.** s
1b2a0 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20  tack space). If 
1b2b0 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
1b2c0 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1b2d0 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61  to a pointer tha
1b2e0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65  t should.** be e
1b2f0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
1b300 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
1b310 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1b320 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  e(). Or, if the 
1b330 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  .** allocation c
1b340 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53  omes from the pS
1b350 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66  pace/szSpace buf
1b360 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20  fer, *ppFree is 
1b370 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62  set to NULL.** b
1b380 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1b390 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
1b3a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
1b3b0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
1b3c0 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  .*/.UnpackedReco
1b3d0 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  rd *sqlite3VdbeA
1b3e0 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
1b3f0 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  rd(.  KeyInfo *p
1b400 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20 20  KeyInfo         
1b410 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70        /* Descrip
1b420 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f  tion of the reco
1b430 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  rd */.){.  Unpac
1b440 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
1b450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1b460 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
1b470 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1b480 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4a0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1b4b0 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
1b4c0 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  */.  nByte = ROU
1b4d0 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1b4e0 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
1b4f0 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
1b500 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 31  nfo->nKeyField+1
1b510 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  );.  p = (Unpack
1b520 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74  edRecord *)sqlit
1b530 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b  e3DbMallocRaw(pK
1b540 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74  eyInfo->db, nByt
1b550 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72  e);.  if( !p ) r
1b560 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d  eturn 0;.  p->aM
1b570 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68  em = (Mem*)&((ch
1b580 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69  ar*)p)[ROUND8(si
1b590 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
1b5a0 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  ord))];.  assert
1b5b0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1b5c0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70  tOrder!=0 );.  p
1b5d0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1b5e0 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
1b5f0 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
1b600 4b 65 79 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  KeyField + 1;.  
1b610 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1b620 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65  ** Given the nKe
1b630 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20  y-byte encoding 
1b640 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70  of a record in p
1b650 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20  Key[], populate 
1b660 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64  the .** Unpacked
1b670 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
1b680 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
1b690 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
1b6a0 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  t with the.** co
1b6b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65  ntents of the de
1b6c0 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f  coded record..*/
1b6d0 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64   .void sqlite3Vd
1b6e0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
1b6f0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1b700 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
1b710 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1b720 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
1b730 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
1b740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b750 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
1b760 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
1b770 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1b780 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
1b790 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
1b7a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1b7b0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
1b7c0 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
1b7d0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1b7e0 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  g. */.){.  const
1b7f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1b800 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
1b810 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1b820 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20  ey;.  int d; .  
1b830 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20  u32 idx;        
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65  /* Offset in aKe
1b860 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  y[] to read from
1b870 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20   */.  u16 u;    
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1b8a0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1b8b0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
1b8c0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
1b8d0 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61  aMem;..  p->defa
1b8e0 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73  ult_rc = 0;.  as
1b8f0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1b900 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
1b910 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
1b920 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1b930 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
1b940 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
1b950 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
1b960 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
1b970 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1b980 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
1b990 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
1b9a0 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
1b9b0 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
1b9c0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1b9d0 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
1b9e0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1b9f0 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
1ba00 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
1ba10 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1ba20 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
1ba30 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
1ba40 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em->szMalloc = 0
1ba50 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
1ba60 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
1ba70 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1ba80 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
1ba90 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
1baa0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69     pMem++;.    i
1bab0 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69  f( (++u)>=p->nFi
1bac0 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  eld ) break;.  }
1bad0 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
1bae0 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1baf0 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
1bb00 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66  ield = u;.}..#if
1bb10 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1bb20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1bb30 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77  tion compares tw
1bb40 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  o index or table
1bb50 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20   record keys in 
1bb60 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
1bb70 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  as the sqlite3Vd
1bb80 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1bb90 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b  ) routine. Unlik
1bba0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
1bbb0 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66  are(),.** this f
1bbc0 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1bbd0 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65  izes and compare
1bbe0 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74  s values using t
1bbf0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  he.** sqlite3Vdb
1bc00 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
1bc10 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1bc20 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  re() functions. 
1bc30 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e  It is used.** in
1bc40 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1bc50 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
1bc60 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
1bc70 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c  d code in.** sql
1bc80 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1bc90 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20  mpare() returns 
1bca0 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65  results with the
1bcb0 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65  se two primitive
1bcc0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1bcd0 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75  true if the resu
1bce0 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
1bcf0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1bd00 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e  o desiredResult.
1bd10 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1bd20 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
1bd30 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a  isagreement..*/.
1bd40 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1bd50 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1bd60 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1bd70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1bd80 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1bd90 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
1bda0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1bdb0 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
1bdc0 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52  /.  int desiredR
1bdd0 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
1bde0 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73    /* Correct ans
1bdf0 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  wer */.){.  u32 
1be00 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
1be10 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
1be20 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
1be30 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
1be40 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1be50 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1be60 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1be70 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
1be80 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1be90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bea0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
1beb0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
1bec0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
1bed0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1bee0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1bef0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1bf00 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1bf10 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1bf20 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
1bf30 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
1bf40 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1bf50 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1bf60 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
1bf70 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
1bf80 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1bf90 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1bfa0 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
1bfb0 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
1bfc0 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
1bfd0 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
1bfe0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
1bff0 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
1c000 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1c010 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1c020 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1c030 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f  atements */..  /
1c040 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20  * Compilers may 
1c050 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65  complain that me
1c060 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74  m1.u.i is potent
1c070 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69  ially uninitiali
1c080 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75  zed..  ** We cou
1c090 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  ld initialize it
1c0a0 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c  , as shown here,
1c0b0 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73   to silence thos
1c0c0 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20  e complaints..  
1c0d0 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20  ** But in fact, 
1c0e0 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65  mem1.u.i will ne
1c0f0 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20  ver actually be 
1c100 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a  used uninitializ
1c110 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20  ed, and doing . 
1c120 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73   ** the unnecess
1c130 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ary initializati
1c140 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61  on has a measura
1c150 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72  ble negative per
1c160 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d  formance.  ** im
1c170 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73  pact, since this
1c180 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65   routine is a ve
1c190 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20  ry high runner. 
1c1a0 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f   And so, we choo
1c1b0 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72  se.  ** to ignor
1c1c0 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  e the compiler w
1c1d0 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76  arnings and leav
1c1e0 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  e this variable 
1c1f0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
1c200 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75   */.  /*  mem1.u
1c210 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20  .i = 0;  // not 
1c220 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
1c230 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
1c240 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20   warning */.  . 
1c250 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1c260 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1c270 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31  1);.  if( szHdr1
1c280 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20  >98307 ) return 
1c290 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
1c2a0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
1c2b0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1c2c0 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50  o->nAllField>=pP
1c2d0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
1c2e0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1c2f0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1c300 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1c310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1c320 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
1c330 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1c340 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1c350 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1c360 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1c370 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
1c380 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
1c390 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
1c3a0 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
1c3b0 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
1c3c0 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
1c3d0 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
1c3e0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
1c3f0 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
1c400 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
1c410 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20  nough key space 
1c420 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f  remaining to avo
1c430 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66  id.    ** a buff
1c440 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68  er overread.  Th
1c450 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  e "d1+serial_typ
1c460 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73  e1+2" subexpress
1c470 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
1c480 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65  always be greate
1c490 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1c4a0 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  to the amount of
1c4b0 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70   required key sp
1c4c0 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20  ace..    ** Use 
1c4d0 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69  that approximati
1c4e0 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  on to avoid the 
1c4f0 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63  more expensive c
1c500 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
1c510 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1c520 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20  ypeLen() in the 
1c530 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20  common case..   
1c540 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73   */.    if( d1+s
1c550 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75  erial_type1+2>(u
1c560 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26  32)nKey1.     &&
1c570 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53   d1+sqlite3VdbeS
1c580 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1c590 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29  ial_type1)>(u32)
1c5a0 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20  nKey1 .    ){.  
1c5b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c5c0 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
1c5d0 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
1c5e0 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
1c5f0 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
1c600 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1c610 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1c620 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
1c630 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
1c640 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
1c650 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1c660 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1c670 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
1c680 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66  aMem[i], pKeyInf
1c690 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20  o->aColl[i]);.  
1c6a0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1c6b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1c6c0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1c6d0 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1c6e0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1c6f0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1c700 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1c710 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1c720 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
1c730 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20  result for DESC 
1c740 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
1c750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1c760 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  o debugCompareEn
1c770 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  d;.    }.    i++
1c780 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1c790 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
1c7a0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
1c7b0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1c7c0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1c7d0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1c7e0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1c7f0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1c800 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1c810 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1c820 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1c830 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1c840 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1c850 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1c860 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1c870 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
1c880 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1c890 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1c8a0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1c8b0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
1c8c0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1c8d0 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1c8e0 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1c8f0 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1c900 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1c910 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1c920 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1c930 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79   */.  rc = pPKey
1c940 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a  2->default_rc;..
1c950 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a  debugCompareEnd:
1c960 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1c970 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30  sult==0 && rc==0
1c980 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1c990 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1c9a0 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74  <0 && rc<0 ) ret
1c9b0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1c9c0 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20  iredResult>0 && 
1c9d0 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc>0 ) return 1;
1c9e0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1c9f0 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
1ca00 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1ca10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ca20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1ca30 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1ca40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ca50 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  EBUG./*.** Count
1ca60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1ca70 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f  ields (a.k.a. co
1ca80 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65  lumns) in the re
1ca90 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a  cord given by.**
1caa0 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65   pKey,nKey.  The
1cab0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1cac0 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20  s count is less 
1cad0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1cae0 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69   the.** limit gi
1caf0 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d  ven by pKeyInfo-
1cb00 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a  >nAllField..**.*
1cb10 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72  * If this constr
1cb20 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69  aint is not sati
1cb30 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20  sfied, it means 
1cb40 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70  that the high-sp
1cb50 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72  eed.** vdbeRecor
1cb60 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1cb70 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  d vdbeRecordComp
1cb80 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74  areString() rout
1cb90 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  ines will.** not
1cba0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1cbb0 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74    If this assert
1cbc0 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69  () ever fires, i
1cbd0 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73  t probably means
1cbe0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79  .** that the Key
1cbf0 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 6f  Info.nKeyField o
1cc00 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69  r KeyInfo.nAllFi
1cc10 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1cc20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1cc30 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1cc40 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1cc50 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1cc60 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1cc70 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1cc80 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1cc90 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1cca0 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1ccb0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1ccc0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1ccd0 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1cce0 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1ccf0 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1cd00 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1cd10 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1cd20 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1cd30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1cd40 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1cd50 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1cd60 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1cd70 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1cd80 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1cd90 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1cda0 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1cdb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1cdc0 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1cdd0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1cde0 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1cdf0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1ce00 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1ce10 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1ce20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1ce30 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1ce40 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b 0a  o->nAllField );.
1ce50 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1ce60 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1ce70 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1ce80 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a  s(A,B,C).#endif.
1ce90 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
1cea0 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
1ceb0 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
1cec0 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
1ced0 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
1cee0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1cef0 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
1cf00 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
1cf10 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
1cf20 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1cf30 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
1cf40 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1cf50 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
1cf60 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
1cf70 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
1cf80 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
1cf90 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
1cfa0 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
1cfb0 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
1cfc0 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
1cfd0 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
1cfe0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
1cff0 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1d000 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
1d010 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38  Seq *pColl,.  u8
1d020 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20   *prcErr        
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d040 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
1d050 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  s, set to SQLITE
1d060 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69  _NOMEM */.){.  i
1d070 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
1d080 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
1d090 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
1d0a0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1d0b0 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
1d0c0 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
1d0d0 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
1d0e0 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
1d0f0 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
1d100 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
1d110 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
1d120 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
1d130 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
1d140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1d150 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
1d160 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
1d170 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
1d180 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  em c2;.    sqlit
1d190 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1d1a0 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  1, pMem1->db, ME
1d1b0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1d1c0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1d1d0 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c2, pMem1->db, 
1d1e0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1d1f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1d200 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
1d210 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
1d220 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d230 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1d240 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
1d250 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
1d260 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1d270 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1d280 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
1d290 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  );.    v2 = sqli
1d2a0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1d2b0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
1d2c0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1d2d0 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c     if( (v1==0 ||
1d2e0 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20   v2==0) ){.     
1d2f0 20 69 66 28 20 70 72 63 45 72 72 20 29 20 2a 70   if( prcErr ) *p
1d300 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e  rcErr = SQLITE_N
1d310 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
1d320 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c   rc = 0;.    }el
1d330 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1d340 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1d350 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76  ->pUser, c1.n, v
1d360 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20  1, c2.n, v2);.  
1d370 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1d380 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1d390 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1d3a0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1d3b0 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  2);.    return r
1d3c0 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1d3d0 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20  The input pBlob 
1d3e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1d3f0 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20   be a Blob that 
1d400 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a  is not marked.**
1d410 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20   with MEM_Zero. 
1d420 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1d430 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65  it could be a ze
1d440 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74  ro-blob..*/.stat
1d450 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f  ic int isAllZero
1d460 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1d470 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
1d480 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
1d490 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
1d4a0 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [i] ) return 0;.
1d4b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1d4c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1d4d0 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1d4e0 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1d4f0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1d500 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1d510 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1d520 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1d530 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1d540 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1d550 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1d560 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1d570 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1d580 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1d590 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74  he lessor..*/.st
1d5a0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
1d5b0 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1d5c0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1d5d0 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1d5e0 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1d5f0 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d  nt c;.  int n1 =
1d600 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e   pB1->n;.  int n
1d610 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f  2 = pB2->n;..  /
1d620 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
1d630 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20   to have a Blob 
1d640 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73  value that has s
1d650 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e  ome non-zero con
1d660 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  tent.  ** follow
1d670 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65  ed by zero conte
1d680 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e  nt.  But that on
1d690 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20  ly comes up for 
1d6a0 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a  Blobs formed.  *
1d6b0 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  * by the OP_Make
1d6c0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61  Record opcode, a
1d6d0 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65  nd such Blobs ne
1d6e0 76 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69  ver get passed i
1d6f0 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1d700 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f  MemCompare(). */
1d710 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d  .  assert( (pB1-
1d720 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1d730 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29  o)==0 || n1==0 )
1d740 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32  ;.  assert( (pB2
1d750 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1d760 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20  ro)==0 || n2==0 
1d770 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e  );..  if( (pB1->
1d780 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73  flags|pB2->flags
1d790 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  ) & MEM_Zero ){.
1d7a0 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61      if( pB1->fla
1d7b0 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20  gs & pB2->flags 
1d7c0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1d7d0 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e      return pB1->
1d7e0 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75  u.nZero - pB2->u
1d7f0 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73  .nZero;.    }els
1d800 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73  e if( pB1->flags
1d810 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1d820 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1d830 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d  ero(pB2->z, pB2-
1d840 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  >n) ) return -1;
1d850 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1d860 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b  1->u.nZero - n2;
1d870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d880 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
1d890 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29  (pB1->z, pB1->n)
1d8a0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d8b0 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20      return n1 - 
1d8c0 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1d8d0 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65    }.  }.  c = me
1d8e0 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32  mcmp(pB1->z, pB2
1d8f0 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20  ->z, n1>n2 ? n2 
1d900 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29  : n1);.  if( c )
1d910 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74   return c;.  ret
1d920 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a  urn n1 - n2;.}..
1d930 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61  /*.** Do a compa
1d940 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20  rison between a 
1d950 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
1d960 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62  teger and a 64-b
1d970 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  it floating-poin
1d980 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65  t.** number.  Re
1d990 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1d9a0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1d9b0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69   if the first (i
1d9c0 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  64) is less than
1d9d0 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  ,.** equal to, o
1d9e0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1d9f0 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c  he second (doubl
1da00 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1da10 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  t sqlite3IntFloa
1da20 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20  tCompare(i64 i, 
1da30 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28  double r){.  if(
1da40 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
1da50 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20  LE_TYPE)>8 ){.  
1da60 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
1da70 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c  E x = (LONGDOUBL
1da80 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66  E_TYPE)i;.    if
1da90 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( x<r ) return -
1daa0 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29  1;.    if( x>r )
1dab0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1dac0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1dad0 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20  e{.    i64 y;.  
1dae0 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20    double s;.    
1daf0 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33  if( r<-922337203
1db00 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1db10 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66  eturn +1;.    if
1db20 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35  ( r>922337203685
1db30 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75  4775807.0 ) retu
1db40 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28  rn -1;.    y = (
1db50 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69  i64)r;.    if( i
1db60 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <y ) return -1;.
1db70 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20      if( i>y ){. 
1db80 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c       if( y==SMAL
1db90 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e  LEST_INT64 && r>
1dba0 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  0.0 ) return -1;
1dbb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31  .      return +1
1dbc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
1dbd0 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69  (double)i;.    i
1dbe0 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20  f( s<r ) return 
1dbf0 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20  -1;.    if( s>r 
1dc00 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1dc10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
1dc20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1dc30 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  the values conta
1dc40 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20  ined by the two 
1dc50 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65  memory cells, re
1dc60 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74  turning.** negat
1dc70 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
1dc80 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69  itive if pMem1 i
1dc90 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1dca0 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1dcb0 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e  r.** than pMem2.
1dcc0 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69   Sorting order i
1dcd0 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20  s NULL's first, 
1dce0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62  followed by numb
1dcf0 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a  ers (integers.**
1dd00 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74   and reals) sort
1dd10 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20  ed numerically, 
1dd20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74  followed by text
1dd30 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20   ordered by the 
1dd40 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
1dd50 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20  uence pColl and 
1dd60 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f  finally blob's o
1dd70 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70  rdered by memcmp
1dd80 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  ()..**.** Two NU
1dd90 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
1dda0 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62  nsidered equal b
1ddb0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1ddc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
1ddd0 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  emCompare(const 
1dde0 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73  Mem *pMem1, cons
1ddf0 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f  t Mem *pMem2, co
1de00 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1de10 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66  ll){.  int f1, f
1de20 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65  2;.  int combine
1de30 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d  d_flags;..  f1 =
1de40 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20   pMem1->flags;. 
1de50 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61   f2 = pMem2->fla
1de60 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66  gs;.  combined_f
1de70 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20  lags = f1|f2;.  
1de80 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
1de90 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  d_flags & MEM_Ro
1dea0 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20  wSet)==0 );. .  
1deb0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1dec0 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
1ded0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
1dee0 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
1def0 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
1df00 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
1df10 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1df20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
1df30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
1df40 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
1df50 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
1df60 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f  .  /* At least o
1df70 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61  ne of the two va
1df80 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72  lues is a number
1df90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1dfa0 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
1dfb0 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
1dfc0 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
1dfd0 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  2 & MEM_Int)!=0 
1dfe0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1dff0 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
1e000 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
1e010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1e020 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
1e030 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.i ) return +1;
1e040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1e050 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1e060 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65  f1 & f2 & MEM_Re
1e070 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1e080 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c  if( pMem1->u.r <
1e090 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1e0a0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1e0b0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20  f( pMem1->u.r > 
1e0c0 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1e0d0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1e0e0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1e0f0 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e    if( (f1&MEM_In
1e100 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1e110 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29  f( (f2&MEM_Real)
1e120 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1e130 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74  eturn sqlite3Int
1e140 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1e150 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e  m1->u.i, pMem2->
1e160 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1e170 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1e180 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1e190 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1e1a0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1e1b0 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1e1c0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1e1d0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c       return -sql
1e1e0 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1e1f0 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20  are(pMem2->u.i, 
1e200 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem1->u.r);.   
1e210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e220 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1e230 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1e240 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20  eturn +1;.  }.. 
1e250 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1e260 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64   is a string and
1e270 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20   the other is a 
1e280 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67  blob, the string
1e290 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
1e2a0 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e  f both are strin
1e2b0 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e  gs, compare usin
1e2c0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  g the collating 
1e2d0 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
1e2e0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1e2f0 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a  lags&MEM_Str ){.
1e300 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45      if( (f1 & ME
1e310 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1e320 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1e330 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26   }.    if( (f2 &
1e340 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1e350 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1e360 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1e370 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1e380 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d  pMem2->enc || pM
1e390 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  em1->db->mallocF
1e3a0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73  ailed );.    ass
1e3b0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1e3c0 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
1e3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
1e3e0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1e3f0 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31  UTF16LE || pMem1
1e400 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1e410 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  F16BE );..    /*
1e420 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
1e430 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
1e440 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20  defined at this 
1e450 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20  point, even if. 
1e460 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64     ** the user d
1e470 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61  eletes the colla
1e480 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66  tion sequence af
1e490 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f  ter the vdbe pro
1e4a0 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63  gram is.    ** c
1e4b0 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61  ompiled (this wa
1e4c0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65  s not always the
1e4d0 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   case)..    */. 
1e4e0 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c     assert( !pCol
1e4f0 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l || pColl->xCmp
1e500 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f   );..    if( pCo
1e510 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
1e520 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  rn vdbeCompareMe
1e530 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70  mString(pMem1, p
1e540 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b  Mem2, pColl, 0);
1e550 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
1e560 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
1e570 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
1e580 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
1e590 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
1e5a0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
1e5b0 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
1e5c0 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1e5d0 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
1e5e0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
1e5f0 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
1e600 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
1e610 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
1e620 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d  e3BlobCompare(pM
1e630 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a  em1, pMem2);.}..
1e640 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
1e650 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1e660 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1e670 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79  n is a serial-ty
1e680 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65  pe that.** corre
1e690 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74  sponds to an int
1e6a0 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65  eger - all value
1e6b0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1e6c0 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20  9 inclusive .** 
1e6d0 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65  except 7. The se
1e6e0 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  cond points to a
1e6f0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1e700 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ng an integer va
1e710 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65  lue.** serialize
1e720 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  d according to s
1e730 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73  erial_type. This
1e740 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1e750 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65  alizes.** and re
1e760 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e  turns the value.
1e770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76  .*/.static i64 v
1e780 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1e790 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  nt(u32 serial_ty
1e7a0 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  pe, const u8 *aK
1e7b0 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20  ey){.  u32 y;.  
1e7c0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1e7d0 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  DB || (serial_ty
1e7e0 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f  pe>=1 && serial_
1e7f0 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61  type<=9 && seria
1e800 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20  l_type!=7) );.  
1e810 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1e820 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1e830 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
1e840 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e850 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e860 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f       return ONE_
1e870 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1e880 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
1e890 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e8a0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e8b0 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54    return TWO_BYT
1e8c0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e8d0 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74   case 3:.      t
1e8e0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1e8f0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1e900 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45  eturn THREE_BYTE
1e910 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1e920 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
1e930 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e940 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e950 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1e960 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1e970 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e  return (i64)*(in
1e980 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20  t*)&y;.    }.   
1e990 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20   case 5: {.     
1e9a0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1e9b0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1e9c0 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54   return FOUR_BYT
1e9d0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1e9e0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1e9f0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1ea00 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
1ea10 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36  se 6: {.      u6
1ea20 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1ea30 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1ea40 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1ea50 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1ea60 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1ea70 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1ea80 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65  Key+4);.      re
1ea90 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a  turn (i64)*(i64*
1eaa0 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )&x;.    }.  }..
1eab0 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
1eac0 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f  _type - 8);.}../
1ead0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1eae0 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
1eaf0 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
1eb00 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
1eb10 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1eb20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
1eb30 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
1eb40 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
1eb50 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
1eb60 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
1eb70 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
1eb80 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1eb90 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1eba0 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
1ebb0 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
1ebc0 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
1ebd0 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
1ebe0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1ebf0 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
1ec00 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
1ec10 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
1ec20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
1ec30 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
1ec40 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
1ec50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
1ec60 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53  * If argument bS
1ec70 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
1ec80 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1ec90 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1eca0 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65  as already.** de
1ecb0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1ecc0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1ecd0 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  f the keys are e
1ece0 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  qual..**.** Key1
1ecf0 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
1ed00 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
1ed10 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1ed20 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61   of fields. If a
1ed30 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68  ll .** fields th
1ed40 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74  at appear in bot
1ed50 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  h keys are equal
1ed60 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64  , then pPKey2->d
1ed70 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a  efault_rc is .**
1ed80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1ed90 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   If database cor
1eda0 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f  ruption is disco
1edb0 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79  vered, set pPKey
1edc0 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a  2->errCode to .*
1edd0 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
1ede0 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49   and return 0. I
1edf0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
1ee00 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a  s encountered, .
1ee10 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  ** pPKey2->errCo
1ee20 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  de is set to SQL
1ee30 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69  ITE_NOMEM and, i
1ee40 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
1ee50 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d  , the.** malloc-
1ee60 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20  failed flag set 
1ee70 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
1ee80 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79  le (pPKey2->pKey
1ee90 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e  Info->db)..*/.in
1eea0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
1eeb0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1eec0 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ip(.  int nKey1,
1eed0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1eee0 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1eef0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1ef00 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1ef10 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1ef20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b  key */.  int bSk
1ef30 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ip              
1ef40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1ef50 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69  rue, skip the fi
1ef60 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  rst field */.){.
1ef70 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1efa0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1efb0 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1efc0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efe0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1eff0 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70  xt field to comp
1f000 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  are */.  u32 szH
1f010 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1f020 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f030 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65   of record heade
1f040 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
1f050 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
1f080 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65  st type in heade
1f090 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1f0a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f0b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f0c0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20   value */.  Mem 
1f0d0 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e  *pRhs = pPKey2->
1f0e0 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  aMem;       /* N
1f0f0 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  ext field of pPK
1f100 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  ey2 to compare *
1f110 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1f120 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1f130 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73  pKeyInfo;.  cons
1f140 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1f150 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1f160 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1f170 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d  pKey1;.  Mem mem
1f180 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69  1;..  /* If bSki
1f190 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  p is true, then 
1f1a0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1f1b0 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65  lready determine
1f1c0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1f1d0 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e  .  ** two elemen
1f1e0 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61  ts in the keys a
1f1f0 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68  re equal. Fix th
1f200 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20  e various stack 
1f210 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a  variables so.  *
1f220 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  * that this rout
1f230 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61  ine begins compa
1f240 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ring at the seco
1f250 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69  nd field. */.  i
1f260 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( bSkip ){.    
1f270 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31  u32 s1;.    idx1
1f280 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74   = 1 + getVarint
1f290 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31  32(&aKey1[1], s1
1f2a0 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20  );.    szHdr1 = 
1f2b0 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31  aKey1[0];.    d1
1f2c0 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69   = szHdr1 + sqli
1f2d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1f2e0 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20  eLen(s1);.    i 
1f2f0 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  = 1;.    pRhs++;
1f300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
1f310 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
1f320 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
1f330 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1f340 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e  ;.    if( d1>(un
1f350 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20  signed)nKey1 ){ 
1f360 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
1f370 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1f380 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f390 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1f3a0 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
1f3b0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20   */.    }.    i 
1f3c0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  = 0;.  }..  VVA_
1f3d0 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1f3e0 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1f3f0 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1f400 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1f410 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1f420 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1f430 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79  nAllField>=pPKey
1f440 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
1f450 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
1f460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1f470 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
1f480 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1f490 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1f4a0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  ->pKeyInfo->nKey
1f4b0 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
1f4c0 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
1f4d0 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
1f4e0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
1f4f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1f500 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20     /* RHS is an 
1f510 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69  integer */.    i
1f520 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1f530 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
1f540 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1f550 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1f560 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1f570 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1f580 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1f590 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
1f5a0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1f5b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1f5c0 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
1f5d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1f5e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1f5f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1f600 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f610 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1f620 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1f630 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1f640 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73  .        rc = -s
1f650 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1f660 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c  mpare(pRhs->u.i,
1f670 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20   mem1.u.r);.    
1f680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f690 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52   i64 lhs = vdbeR
1f6a0 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73  ecordDecodeInt(s
1f6b0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65  erial_type, &aKe
1f6c0 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20  y1[d1]);.       
1f6d0 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d   i64 rhs = pRhs-
1f6e0 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66  >u.i;.        if
1f6f0 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1f700 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1f710 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1f720 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1f730 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1f740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f750 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1f760 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20  RHS is real */. 
1f770 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1f780 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1f790 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  al ){.      seri
1f7a0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1f7b0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  idx1];.      if(
1f7c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1f7d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
1f7e0 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f  erial types 12 o
1f7f0 72 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74  r greater are st
1f800 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20  rings and blobs 
1f810 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20  (greater than.  
1f820 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73        ** numbers
1f830 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20  ). Types 10 and 
1f840 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  11 are currently
1f850 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66   "reserved for f
1f860 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  uture .        *
1f870 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f  * use", so it do
1f880 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74  esn't really mat
1f890 74 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73  ter what the res
1f8a0 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e  ults of comparin
1f8b0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
1f8c0 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61  m to numberic va
1f8d0 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20  lues are.  */.  
1f8e0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1f8f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1f900 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
1f910 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1f920 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f940 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1f950 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1f960 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
1f970 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1f980 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1f990 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e       if( mem1.u.
1f9a0 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20  r<pRhs->u.r ){. 
1f9b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f9c0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  -1;.          }e
1f9d0 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72  lse if( mem1.u.r
1f9e0 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20  >pRhs->u.r ){.  
1f9f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1fa00 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
1fa10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1fa20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fa30 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1fa40 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52  are(mem1.u.i, pR
1fa50 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  hs->u.r);.      
1fa60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1fa70 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1fa80 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20   a string */.   
1fa90 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1faa0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
1fab0 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  ){.      getVari
1fac0 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
1fad0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1fae0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1faf0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1fb00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1fb10 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
1fb20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1fb30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1fb40 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
1fb50 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1fb60 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1fb70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fb80 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c  mem1.n = (serial
1fb90 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
1fba0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1fbb0 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d  e( (d1+mem1.n)==
1fbc0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1fbd0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1fbe0 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b  ase( (d1+mem1.n+
1fbf0 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1fc00 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1fc10 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e  f( (d1+mem1.n) >
1fc20 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
1fc30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1fc40 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1fc50 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1fc60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1fc70 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1fc90 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1fca0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1fcb0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1fcc0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ] ){.          m
1fcd0 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1fce0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20  fo->enc;.       
1fcf0 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65     mem1.db = pKe
1fd00 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20  yInfo->db;.     
1fd10 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20       mem1.flags 
1fd20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20  = MEM_Str;.     
1fd30 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63       mem1.z = (c
1fd40 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b  har*)&aKey1[d1];
1fd50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fd60 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1fd70 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20  ring(.          
1fd80 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c      &mem1, pRhs,
1fd90 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1fda0 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72  [i], &pPKey2->er
1fdb0 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20  rCode.          
1fdc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1fdd0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1fde0 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e  nCmp = MIN(mem1.
1fdf0 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  n, pRhs->n);.   
1fe00 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1fe10 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1fe20 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1fe30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1fe40 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e  =0 ) rc = mem1.n
1fe50 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20   - pRhs->n; .   
1fe60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1fe70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1fe80 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
1fe90 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1fea0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
1feb0 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
1fec0 74 28 20 28 70 52 68 73 2d 3e 66 6c 61 67 73 20  t( (pRhs->flags 
1fed0 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1fee0 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a  | pRhs->n==0 );.
1fef0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1ff00 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1ff10 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1ff20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1ff30 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1ff40 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1ff50 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65  l_type<12 || (se
1ff60 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1ff70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1ff80 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1ff90 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
1ffa0 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
1ffb0 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1ffc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ffd0 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69  (d1+nStr)==(unsi
1ffe0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1fff0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20000 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e  (d1+nStr+1)==(un
20010 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
20020 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
20030 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65  nStr) > (unsigne
20040 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
20050 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
20060 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
20070 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20080 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
20090 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
200a0 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
200b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
200c0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
200d0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
200e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 69            if( !i
200f0 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20  sAllZero((const 
20100 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d  char*)&aKey1[d1]
20110 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20 20 20 20  ,nStr) ){.      
20120 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
20130 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20140 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
20150 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e  nStr - pRhs->u.n
20160 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Zero;.          
20170 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
20180 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
20190 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
201a0 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
201b0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
201c0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
201d0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
201e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
201f0 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
20200 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
20210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20220 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
20230 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
20240 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
20250 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
20260 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
20270 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
20280 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
20290 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
202a0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
202b0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
202c0 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
202d0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
202e0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
202f0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
20300 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20310 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
20320 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
20330 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
20340 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
20350 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
20360 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
20370 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
20380 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
20390 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
203a0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
203b0 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
203c0 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
203d0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
203e0 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
203f0 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
20400 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
20410 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
20420 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
20430 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
20440 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
20450 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
20460 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
20470 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
20480 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
20490 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
204a0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
204b0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
204c0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
204d0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
204e0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
204f0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20500 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
20510 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
20520 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
20530 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
20540 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
20550 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
20560 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
20570 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
20580 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
20590 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
205a0 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
205b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
205c0 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
205d0 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
205e0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
205f0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20600 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
20610 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
20620 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
20630 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
20640 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65  .  pPKey2->eqSee
20650 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  n = 1;.  return 
20660 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
20670 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
20680 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20690 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
206a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
206b0 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
206c0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
206d0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
206e0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
206f0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  key */.){.  retu
20700 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
20710 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
20720 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
20730 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a  , pPKey2, 0);.}.
20740 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20750 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
20760 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
20770 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20780 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
20790 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
207a0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
207b0 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
207c0 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
207d0 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
207e0 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
207f0 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
20800 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
20810 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
20820 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
20830 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
20840 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
20850 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
20860 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
20870 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
20880 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
20890 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
208a0 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
208b0 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
208c0 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
208d0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
208e0 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
208f0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
20900 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
20910 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
20920 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
20930 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
20940 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
20950 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20   const u8 *aKey 
20960 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  = &((const u8*)p
20970 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38  Key1)[*(const u8
20980 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b  *)pKey1 & 0x3F];
20990 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
209a0 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a  pe = ((const u8*
209b0 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e  )pKey1)[1];.  in
209c0 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a  t res;.  u32 y;.
209d0 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76    u64 x;.  i64 v
209e0 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20  ;.  i64 lhs;..  
209f0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
20a00 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
20a10 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20a20 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
20a30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75  ;.  assert( (*(u
20a40 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20  8*)pKey1)<=0x3F 
20a50 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
20a60 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
20a70 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
20a80 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
20a90 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
20aa0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
20ab0 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
20ac0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20ad0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20af0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
20b00 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
20b10 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20b20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  lhs = TWO_BYTE_I
20b30 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20b40 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
20b50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20b60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
20b70 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
20b80 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
20b90 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45        lhs = THRE
20ba0 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
20bb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20bc0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
20bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20be0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
20bf0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
20c00 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20  eger */.      y 
20c10 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
20c20 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68  (aKey);.      lh
20c30 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  s = (i64)*(int*)
20c40 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &y;.      testca
20c50 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20c60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20c70 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
20c80 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
20c90 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20ca0 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  lhs = FOUR_BYTE_
20cb0 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
20cc0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
20cd0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
20ce0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20cf0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
20d00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20d10 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38    case 6: { /* 8
20d20 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
20d30 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20  eger */.      x 
20d40 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
20d50 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20  (aKey);.      x 
20d60 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
20d70 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
20d80 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  4);.      lhs = 
20d90 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
20da0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
20db0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
20dc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20dd0 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  8: .      lhs = 
20de0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
20df0 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20      case 9:.    
20e00 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20    lhs = 1;.     
20e10 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
20e20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20  This case could 
20e30 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f  be removed witho
20e40 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
20e50 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69  results of runni
20e60 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  ng.    ** this c
20e70 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69  ode. Including i
20e80 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20  t causes gcc to 
20e90 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65  generate a faste
20ea0 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a  r switch .    **
20eb0 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63   statement (sinc
20ec0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73  e the range of s
20ed0 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f  witch targets no
20ee0 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f  w starts at zero
20ef0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63   and.    ** is c
20f00 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64  ontiguous) but d
20f10 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
20f20 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65  y duplicate code
20f30 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
20f40 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20  .    ** (as gcc 
20f50 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68  is clever enough
20f60 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
20f70 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e  two like cases).
20f80 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   Other .    ** c
20f90 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62  ompilers might b
20fa0 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a  e similar.  */ .
20fb0 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65      case 0: case
20fc0 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e   7:.      return
20fd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20fe0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
20ff0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
21000 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
21010 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
21020 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21030 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
21040 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a  1, pPKey2);.  }.
21050 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61  .  v = pPKey2->a
21060 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66  Mem[0].u.i;.  if
21070 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v>lhs ){.    r
21080 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
21090 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c  .  }else if( v<l
210a0 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
210b0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65  pPKey2->r2;.  }e
210c0 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
210d0 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
210e0 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
210f0 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
21100 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43  eys are equal. C
21110 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c  ompare the trail
21120 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ing .    ** fiel
21130 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  ds.  */.    res 
21140 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
21150 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
21160 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
21170 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d   pPKey2, 1);.  }
21180 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
21190 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
211a0 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
211b0 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72  e equal and ther
211c0 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e  e are no trailin
211d0 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e  g.    ** fields.
211e0 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   Return pPKey2->
211f0 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68  default_rc in th
21200 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
21210 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
21220 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50  fault_rc;.    pP
21230 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31  Key2->eqSeen = 1
21240 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
21250 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
21260 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
21270 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
21280 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  s) );.  return r
21290 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  es;.}../*.** Thi
212a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
212b0 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
212c0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
212d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
212e0 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
212f0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
21300 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72   pPKey2 is a str
21310 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68  ing, that (b) th
21320 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a  e first field.**
21330 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
21340 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
21350 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74  ARY and (c) that
21360 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
21370 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61  der varint .** a
21380 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
21390 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
213a0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
213b0 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
213c0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
213d0 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74  areString(.  int
213e0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
213f0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
21400 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
21410 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
21420 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
21430 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
21440 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d  onst u8 *aKey1 =
21450 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79   (const u8*)pKey
21460 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  1;.  int serial_
21470 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b  type;.  int res;
21480 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ..  assert( pPKe
21490 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67  y2->aMem[0].flag
214a0 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
214b0 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
214c0 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
214d0 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  s(nKey1, pKey1, 
214e0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
214f0 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32  );.  getVarint32
21500 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69  (&aKey1[1], seri
21510 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20  al_type);.  if( 
21520 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
21530 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
21540 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20  y2->r1;      /* 
21550 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
21560 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e   a number or a n
21570 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ull */.  }else i
21580 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
21590 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20   & 0x01) ){ .   
215a0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
215b0 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  2;      /* (pKey
215c0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c  1/nKey1) is a bl
215d0 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ob */.  }else{. 
215e0 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
215f0 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69   int nStr;.    i
21600 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31  nt szHdr = aKey1
21610 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d  [0];..    nStr =
21620 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
21630 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28  ) / 2;.    if( (
21640 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20  szHdr + nStr) > 
21650 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70  nKey1 ){.      p
21660 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
21670 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
21680 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
21690 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
216a0 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
216b0 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d    }.    nCmp = M
216c0 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  IN( pPKey2->aMem
216d0 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20  [0].n, nStr );. 
216e0 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
216f0 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70  &aKey1[szHdr], p
21700 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a  PKey2->aMem[0].z
21710 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66  , nCmp);..    if
21720 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
21730 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70    res = nStr - p
21740 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
21750 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
21760 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
21770 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
21780 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
21790 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
217a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
217b0 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
217c0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
217d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
217e0 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
217f0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
21800 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  rc;.          pP
21810 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31  Key2->eqSeen = 1
21820 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21830 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e    }else if( res>
21840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  0 ){.        res
21850 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
21860 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21870 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
21880 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ->r1;.      }.  
21890 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e    }else if( res>
218a0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
218b0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
218c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
218d0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
218e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
218f0 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
21900 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
21910 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21920 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c  , res).       ||
21930 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20   CORRUPT_DB.    
21940 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b     || pPKey2->pK
21950 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
21960 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
21970 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
21980 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
21990 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
219a0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
219b0 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c  pare() compatibl
219c0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75  e function.** su
219d0 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61  itable for compa
219e0 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20  ring serialized 
219f0 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75  records to the u
21a00 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70  npacked record p
21a10 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
21a20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
21a30 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20  /.RecordCompare 
21a40 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
21a50 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52  ompare(UnpackedR
21a60 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20  ecord *p){.  /* 
21a70 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
21a80 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72  areInt() and var
21a90 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
21aa0 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73  String() both as
21ab0 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  sume.  ** that t
21ac0 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
21ad0 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63  r varint that oc
21ae0 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72  curs at the star
21af0 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64  t of each record
21b00 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20  .  ** fits in a 
21b10 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65  single byte (i.e
21b20 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73  . is 127 or less
21b30 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  ). varintRecordC
21b40 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a  ompareInt().  **
21b50 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
21b60 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  at it is safe to
21b70 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66   overread a buff
21b80 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74  er by at least t
21b90 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d  he .  ** maximum
21ba0 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20   possible legal 
21bb0 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73  header size plus
21bc0 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73   8 bytes. Becaus
21bd0 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  e there is.  ** 
21be0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
21bf0 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75   at least 74 (bu
21c00 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73  t not 136) bytes
21c10 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c   of padding foll
21c20 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20  owing each.  ** 
21c30 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f  buffer passed to
21c40 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
21c50 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d  pareInt() this m
21c60 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65  akes it convenie
21c70 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74  nt to.  ** limit
21c80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21c90 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79   header to 64 by
21ca0 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65  tes in cases whe
21cb0 72 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65  re the first fie
21cc0 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e  ld.  ** is an in
21cd0 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger..  **.  **
21ce0 20 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79   The easiest way
21cf0 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
21d00 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e   limit is to con
21d10 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72  sider only recor
21d20 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20  ds with.  ** 13 
21d30 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20  fields or less. 
21d40 49 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65  If the first fie
21d50 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ld is an integer
21d60 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  , the maximum le
21d70 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  gal.  ** header 
21d80 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20  size is (12*5 + 
21d90 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a  1 + 1) bytes.  *
21da0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49  /.  if( p->pKeyI
21db0 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d  nfo->nAllField<=
21dc0 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
21dd0 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
21de0 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
21df0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
21e00 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
21e10 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
21e20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
21e30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21e40 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
21e50 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
21e60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
21e70 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
21e80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
21e90 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21ea0 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
21eb0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
21ec0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
21ed0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
21ee0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
21ef0 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
21f00 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
21f10 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
21f20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
21f30 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
21f40 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
21f50 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
21f60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21f70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
21f80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21f90 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21fa0 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
21fb0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
21fc0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21fd0 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
21fe0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
21ff0 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
22000 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
22010 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
22020 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
22030 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
22040 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
22050 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
22060 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
22070 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
22080 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
22090 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
220a0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
220b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
220c0 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
220d0 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
220e0 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
220f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
22100 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
22110 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
22120 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
22130 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
22140 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
22150 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
22160 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
22170 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
22180 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
22190 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
221a0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
221b0 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
221c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
221d0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
221e0 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
221f0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
22200 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
22210 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
22220 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
22230 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
22240 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
22250 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
22260 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
22270 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
22280 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
22290 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
222a0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
222b0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
222c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
222d0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
222e0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
222f0 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
22300 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
22310 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
22320 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
22330 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
22340 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
22350 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
22360 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22370 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
22380 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
22390 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
223a0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
223b0 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72  e(pCur);.  asser
223c0 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
223d0 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
223e0 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
223f0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
22400 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
22410 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
22420 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
22430 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
22440 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
22450 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
22460 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
22470 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
22480 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
22490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
224a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
224b0 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
224c0 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
224d0 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
224e0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
224f0 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
22500 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
22510 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
22520 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
22530 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
22540 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
22550 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
22560 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
22570 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
22580 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
22590 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
225a0 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
225b0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
225c0 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
225d0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
225e0 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
225f0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
22600 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
22610 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
22620 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
22630 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
22640 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
22650 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22660 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
22670 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22680 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
22690 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
226a0 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
226b0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
226c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
226d0 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
226e0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
226f0 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
22700 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22710 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
22720 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
22730 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
22740 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
22750 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
22760 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
22770 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
22780 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
22790 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
227a0 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
227b0 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
227c0 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
227d0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
227e0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
227f0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
22800 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
22810 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
22820 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
22830 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
22840 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
22850 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
22860 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
22870 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
22880 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
22890 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
228a0 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
228b0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
228c0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
228d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
228e0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
228f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
22900 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
22910 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
22920 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
22930 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
22940 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
22950 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
22960 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
22970 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
22980 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
22990 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
229a0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
229b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
229c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
229d0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
229e0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
229f0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
22a00 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
22a10 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
22a20 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
22a30 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
22a40 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
22a50 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
22a60 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
22a70 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
22a80 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
22a90 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
22aa0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
22ab0 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
22ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22ad0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
22ae0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
22af0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
22b00 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
22b10 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
22b20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
22b30 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
22b40 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
22b50 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
22b60 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
22b70 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
22b80 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
22b90 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
22ba0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
22bb0 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
22bc0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
22bd0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
22be0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
22bf0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
22c00 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
22c10 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
22c20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
22c30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
22c40 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
22c50 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
22c60 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
22c70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
22c80 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
22c90 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
22ca0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
22cb0 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
22cc0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
22cd0 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
22ce0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22d00 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
22d10 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
22d20 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
22d30 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
22d40 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
22d50 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b   *pCur;.  Mem m;
22d60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ..  assert( pC->
22d70 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
22d80 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75  E_BTREE );.  pCu
22d90 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
22da0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
22db0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
22dc0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
22dd0 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71  .  nCellKey = sq
22de0 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
22df0 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f  dSize(pCur);.  /
22e00 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20  * nCellKey will 
22e10 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65  always be betwee
22e20 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66  n 0 and 0xffffff
22e30 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ff because of th
22e40 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20  e way.  ** that 
22e50 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
22e60 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47  r() and sqlite3G
22e70 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65  etVarint32() are
22e80 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a   implemented */.
22e90 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
22ea0 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
22eb0 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  7fffffff ){.    
22ec0 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
22ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22ee0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
22ef0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
22f00 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20  it(&m, db, 0);. 
22f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
22f20 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
22f30 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  ur, 0, (u32)nCel
22f40 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28  lKey, &m);.  if(
22f50 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
22f60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73  n rc;.  }.  *res
22f70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
22f80 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c  cordCompare(m.n,
22f90 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29   m.z, pUnpacked)
22fa0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
22fb0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
22fc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22fd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
22fe0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
22ff0 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
23000 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
23010 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
23020 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
23030 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
23040 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
23050 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23060 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
23070 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
23080 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
23090 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
230a0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
230b0 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
230c0 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
230d0 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
230e0 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
230f0 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
23100 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
23110 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
23120 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
23130 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
23140 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
23150 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
23160 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
23170 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
23180 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
23190 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
231a0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
231b0 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
231c0 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
231d0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
231e0 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
231f0 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
23200 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
23210 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
23220 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
23230 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
23240 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
23250 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
23260 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
23270 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
23280 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
23290 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
232a0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
232b0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
232c0 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
232d0 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
232e0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
232f0 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
23300 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
23310 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
23320 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
23330 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
23340 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
23350 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
23360 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
23370 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
23380 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
23390 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
233a0 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
233b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
233c0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
233d0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
233e0 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
233f0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
23400 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
23410 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
23420 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49   Return the SQLI
23430 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73  TE_PREPARE flags
23440 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a   for a Vdbe..*/.
23450 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  u8 sqlite3VdbePr
23460 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65 20  epareFlags(Vdbe 
23470 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
23480 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f  >prepFlags;.}../
23490 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
234a0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
234b0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
234c0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
234d0 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
234e0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
234f0 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
23500 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
23510 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
23520 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
23530 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
23540 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
23550 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
23560 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
23570 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
23580 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
23590 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
235a0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
235b0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
235c0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
235d0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
235e0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
235f0 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
23600 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
23610 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
23620 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
23630 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
23640 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
23650 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
23660 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
23670 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61  r[iVar-1];.    a
23680 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66  ssert( (v->db->f
23690 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
236a0 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a  ableQPSG)==0 );.
236b0 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
236c0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
236d0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
236e0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
236f0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
23700 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
23710 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
23720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23730 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
23740 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
23750 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
23760 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
23770 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
23780 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  UTF8);.      }. 
23790 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
237a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
237b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
237c0 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
237d0 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
237e0 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
237f0 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
23800 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
23810 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
23820 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
23830 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
23840 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
23850 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
23860 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
23870 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
23880 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
23890 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
238a0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
238b0 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
238c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
238d0 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
238e0 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20  .  if( iVar>=32 
238f0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
23900 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b  k |= 0x80000000;
23910 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
23920 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
23930 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
23940 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
23950 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  ause a function 
23960 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  to throw an erro
23970 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c  r if it was call
23980 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e   from OP_PureFun
23990 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  c.** rather than
239a0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OP_Function..**
239b0 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20  .** OP_PureFunc 
239c0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
239d0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
239e0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61  deterministic, a
239f0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72  nd should.** thr
23a00 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
23a10 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74  t is given input
23a20 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  s that would mak
23a30 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  e it non-determi
23a40 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20  nistic..** This 
23a50 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
23a60 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20  ed by date/time 
23a70 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
23a80 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  se non-determini
23a90 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73  stic.** features
23aa0 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a   such as 'now'..
23ab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  */.int sqlite3No
23ac0 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65  tPureFunc(sqlite
23ad0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
23ae0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
23af0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
23b00 53 54 41 54 34 0a 20 20 69 66 28 20 70 43 74 78  STAT4.  if( pCtx
23b10 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74  ->pVdbe==0 ) ret
23b20 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 1;.#endif.  
23b30 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d  if( pCtx->pVdbe-
23b40 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e  >aOp[pCtx->iOp].
23b50 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46  opcode==OP_PureF
23b60 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
23b70 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
23b80 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e  pCtx, .       "n
23b90 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
23ba0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64   function in ind
23bb0 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  ex expression or
23bc0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
23bd0 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a  t",.       -1);.
23be0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
23bf0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
23c00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23c10 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
23c20 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
23c30 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
23c40 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
23c50 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
23c60 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
23c70 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
23c80 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
23c90 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
23ca0 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
23cb0 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
23cc0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
23cd0 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
23ce0 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
23cf0 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
23d00 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
23d10 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
23d20 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
23d30 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
23d40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23d50 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
23d60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
23d70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
23d80 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
23d90 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
23da0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
23db0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23dc0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
23dd0 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
23de0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
23df0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23e00 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
23e10 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
23e20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
23e30 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
23e40 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
23e50 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
23e60 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
23e70 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
23e80 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
23e90 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
23ea0 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
23eb0 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
23ec0 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
23ed0 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
23ee0 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
23ef0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
23f00 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
23f10 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
23f20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
23f30 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
23f40 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
23f50 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
23f60 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
23f70 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
23f80 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
23f90 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
23fa0 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
23fb0 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55  b, int nField, U
23fc0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
23fd0 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
23fe0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23ff0 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
24000 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20  i++){.      Mem 
24010 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
24020 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
24030 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73  Mem->zMalloc ) s
24040 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
24050 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
24060 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
24070 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
24080 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
24090 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
240a0 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
240b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
240c0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
240d0 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
240e0 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
240f0 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
24100 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
24110 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
24120 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
24130 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
24140 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24150 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
24160 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
24170 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
24180 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
24190 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
241a0 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
241b0 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
241c0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
241d0 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
241e0 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
241f0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
24200 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
24210 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
24220 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
24250 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
24260 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
24270 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
24280 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
24290 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
242a0 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
242b0 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
242c0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
242d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
242e0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
242f0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
24300 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24310 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
24320 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
24330 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
24340 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
24350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
24360 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
24370 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
243a0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
243b0 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
243c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
243d0 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
243e0 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
243f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
24400 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
24410 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
24420 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
24430 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
24440 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
24450 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
24460 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
24470 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
24480 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
24490 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
244a0 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
244b0 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
244c0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
244d0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31  ==0 ){.    iKey1
244e0 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20   = iKey2 = 0;.  
244f0 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20    preupdate.pPk 
24500 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
24510 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
24520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
24530 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
24540 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  TE ){.      iKey
24550 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
24560 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ].u.i;.    }else
24570 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
24580 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  iKey1;.    }.  }
24590 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
245a0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
245b0 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
245c0 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
245d0 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
245e0 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
245f0 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
24600 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
24610 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
24620 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
24630 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
24640 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
24650 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
24660 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
24670 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
24680 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
24690 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
246a0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
246b0 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d  info.nKeyField =
246c0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70   pTab->nCol;.  p
246d0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
246e0 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  .aSortOrder = (u
246f0 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65  8*)&fakeSortOrde
24700 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  r;.  preupdate.i
24710 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key1 = iKey1;.  
24720 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20  preupdate.iKey2 
24730 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70  = iKey2;.  preup
24740 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62  date.pTab = pTab
24750 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  ;..  db->pPreUpd
24760 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65  ate = &preupdate
24770 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
24780 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
24790 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62  PreUpdateArg, db
247a0 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  , op, zDb, zTbl,
247b0 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a   iKey1, iKey2);.
247c0 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
247d0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
247e0 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
247f0 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20  ate.aRecord);.  
24800 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
24810 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b  (db, preupdate.k
24820 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64  eyinfo.nKeyField
24830 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55  +1, preupdate.pU
24840 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65  npacked);.  vdbe
24850 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
24860 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
24870 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20  fo.nKeyField+1, 
24880 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e  preupdate.pNewUn
24890 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70  packed);.  if( p
248a0 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b  reupdate.aNew ){
248b0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
248c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
248d0 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
248e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
248f0 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75  MemRelease(&preu
24900 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a  pdate.aNew[i]);.
24910 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24920 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72  3DbFreeNN(db, pr
24930 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20  eupdate.aNew);. 
24940 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
24950 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
24960 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a     UPDATE_HOOK */.