/ Hex Artifact Content
Login

Artifact c3c397274380f13db702baa3506ba87379446a4d71135a1177b624f73dd3c830:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70   pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42  A->expmask;.  pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41  ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d  ->prepFlags;.  m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74  emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72  er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f  , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61  unter));.  pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53  Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f  ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20  es not grow too 
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e  large */.  if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69  New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20  _VDBE_OP] ){.   
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  (p->db);.    ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
15c0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
15d0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74  Op[i]);.    test
15e0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
15f0: 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t();.  }.#endif.
1600: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
1610: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
1620: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1630: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
1640: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1650: 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d  _COVERAGE.  pOp-
1660: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23  >iSrcLine = 0;.#
1670: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
1680: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1690: 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a  dbeAddOp0(Vdbe *
16a0: 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65  p, int op){.  re
16b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c  AddOp3(p, op, 0,
16d0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
16e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
1700: 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75   int p1){.  retu
1710: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1720: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1730: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
1740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56  ite3VdbeAddOp2(V
1750: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1760: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
1770: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1780: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1790: 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d  p, p1, p2, 0);.}
17a0: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
17b0: 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64  de for an uncond
17c0: 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20  itional jump to 
17d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73  instruction iDes
17e0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
17f0: 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70  VdbeGoto(Vdbe *p
1800: 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20  , int iDest){.  
1810: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1820: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47  beAddOp3(p, OP_G
1830: 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30  oto, 0, iDest, 0
1840: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  );.}../* Generat
1850: 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20  e code to cause 
1860: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20  the string zStr 
1870: 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74  to be loaded int
1880: 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44  o.** register iD
1890: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
18a0: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
18b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
18c0: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
18d0: 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e  *zStr){.  return
18e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f0: 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(p, OP_String8
1900: 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a  , 0, iDest, 0, z
1910: 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str, 0);.}../*.*
1920: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1930: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
1940: 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74   multiple regist
1950: 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72  ers to string or
1960: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
1970: 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  tants.  The regi
1980: 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 68  sters begin with
1990: 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65   iDest and incre
19a0: 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c  ase consecutivel
19b0: 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74  y..** One regist
19c0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
19d0: 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61  d for each chara
19e0: 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b  cgter in zTypes[
19f0: 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20  ].  For each.** 
1a00: 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69 6e  "s" character in
1a10: 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72   zTypes[], the r
1a20: 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74 72  egister is a str
1a30: 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 6d  ing if the argum
1a40: 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55  ent is.** not NU
1a50: 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69  LL, or OP_Null i
1a60: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1a70: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20   null pointer.  
1a80: 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 61  For each "i" cha
1a90: 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79  racter.** in zTy
1aa0: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1ab0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1ac0: 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
1ad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1ae0: 6e 70 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73  nput string does
1af0: 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58   not end with "X
1b00: 22 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73  " then an OP_Res
1b10: 75 6c 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69  ultRow instructi
1b20: 6f 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  on.** is generat
1b30: 65 64 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ed for the value
1b40: 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76  s inserted..*/.v
1b50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
1b60: 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70  ultiLoad(Vdbe *p
1b70: 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e  , int iDest, con
1b80: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c  st char *zTypes,
1b90: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1ba0: 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   ap;.  int i;.  
1bb0: 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61  char c;.  va_sta
1bc0: 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a  rt(ap, zTypes);.
1bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
1be0: 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69  zTypes[i])!=0; i
1bf0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++){.    if( c==
1c00: 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  's' ){.      con
1c10: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f  st char *z = va_
1c20: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
1c30: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
1c40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1c50: 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20   z==0 ? OP_Null 
1c60: 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  : OP_String8, 0,
1c70: 20 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20   iDest+i, 0, z, 
1c80: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
1c90: 28 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  ( c=='i' ){.    
1ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb0: 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(p, OP_Intege
1cc0: 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  r, va_arg(ap, in
1cd0: 74 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20  t), iDest+i);.  
1ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
1cf0: 6f 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75  oto skip_op_resu
1d00: 6c 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d  ltrow;.    }.  }
1d10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d20: 64 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(p, OP_Resul
1d30: 74 52 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b  tRow, iDest, i);
1d40: 0a 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72  .skip_op_resultr
1d50: 6f 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  ow:.  va_end(ap)
1d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1d70: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1d80: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1d90: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1da0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1db0: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1dc0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1dd0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1de0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
1df0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
1e00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1e10: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
1e20: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
1e30: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
1e40: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1e60: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1e70: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e90: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1eb0: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1ec0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1ed0: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1ee0: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
1ef0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
1f00: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1f10: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1f20: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
1f30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1f40: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1f50: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1f60: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1f70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1f80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1f90: 70 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20  p4 value with a 
1fa0: 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50  P4_INT64 or.** P
1fb0: 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a  4_REAL type..*/.
1fc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1fd0: 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62  ddOp4Dup8(.  Vdb
1fe0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ff0: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
2000: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
2010: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2020: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
2030: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
2040: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
2050: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
2060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2080: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
2090: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
20b0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
20c0: 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20  onst u8 *zP4,   
20d0: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
20e0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
20f0: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
2100: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
2110: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
2120: 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44  4copy = sqlite3D
2130: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c  bMallocRawNN(sql
2140: 69 74 65 33 56 64 62 65 44 62 28 70 29 2c 20 38  ite3VdbeDb(p), 8
2150: 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20  );.  if( p4copy 
2160: 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c  ) memcpy(p4copy,
2170: 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75   zP4, 8);.  retu
2180: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
2190: 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp4(p, op, p1, 
21a0: 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20  p2, p3, p4copy, 
21b0: 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e  p4type);.}..#ifn
21c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21d0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65  EXPLAIN./*.** Re
21e0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
21f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2200: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2210: 41 4e 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20  AN baseline..** 
2220: 30 20 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a  0 means "none"..
2230: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2240: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2250: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
2260: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
2270: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
2280: 72 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  rExplain==0 ) re
2290: 74 75 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20  turn 0;.  pOp = 
22a0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
22b0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
22c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c  pParse->addrExpl
22d0: 61 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ain);.  return p
22e0: 4f 70 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op->p2;.}../*.**
22f0: 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78   Add a new OP_Ex
2300: 70 6c 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  plain opcode..**
2310: 0a 2a 2a 20 49 66 20 74 68 65 20 62 50 75 73 68  .** If the bPush
2320: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
2330: 68 65 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70  hen make this op
2340: 63 6f 64 65 20 74 68 65 20 70 61 72 65 6e 74 20  code the parent 
2350: 66 6f 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  for.** subsequen
2360: 74 20 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c  t Explains until
2370: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
2380: 61 69 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c  ainPop() is call
2390: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
23a0: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50  te3VdbeExplain(P
23b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38  arse *pParse, u8
23c0: 20 62 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68   bPush, const ch
23d0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
23e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
23f0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2400: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20  char *zMsg;.    
2410: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f  Vdbe *v;.    va_
2420: 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74  list ap;.    int
2430: 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73   iThis;.    va_s
2440: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
2450: 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
2460: 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73  e3VMPrintf(pPars
2470: 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29  e->db, zFmt, ap)
2480: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
2490: 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  ;.    v = pParse
24a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68  ->pVdbe;.    iTh
24b0: 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  is = v->nOp;.   
24c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24d0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
24e0: 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d  , iThis, pParse-
24f0: 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c  >addrExplain, 0,
2500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2510: 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f         zMsg, P4_
2520: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66  DYNAMIC);.    if
2530: 28 20 62 50 75 73 68 29 20 70 50 61 72 73 65 2d  ( bPush) pParse-
2540: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69  >addrExplain = i
2550: 54 68 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  This;.  }.}../*.
2560: 2a 2a 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41  ** Pop the EXPLA
2570: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74  IN QUERY PLAN st
2580: 61 63 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a  ack one level..*
2590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25a0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72  beExplainPop(Par
25b0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
25c0: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
25d0: 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  in = sqlite3Vdbe
25e0: 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50  ExplainParent(pP
25f0: 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  arse);.}.#endif 
2600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
2610: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
2620: 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65   Add an OP_Parse
2630: 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20  Schema opcode.  
2640: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2650: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a  broken out from.
2660: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
2670: 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20  dOp4() since it 
2680: 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65  needs to also ne
2690: 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20  eds to mark all 
26a0: 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76  btrees.** as hav
26b0: 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a  ing been used..*
26c0: 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20  *.** The zWhere 
26d0: 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65  string must have
26e0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
26f0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
2700: 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  oc()..** This ro
2710: 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20  utine will take 
2720: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
2730: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
2740: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
2750: 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
2760: 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20  hemaOp(Vdbe *p, 
2770: 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a  int iDb, char *z
2780: 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b  Where){.  int j;
2790: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
27a0: 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65  dOp4(p, OP_Parse
27b0: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20  Schema, iDb, 0, 
27c0: 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59  0, zWhere, P4_DY
27d0: 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d  NAMIC);.  for(j=
27e0: 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b  0; j<p->db->nDb;
27f0: 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62   j++) sqlite3Vdb
2800: 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29  eUsesBtree(p, j)
2810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2820: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
2830: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
2840: 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65  lue as an intege
2850: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a  3VdbeAddOp4Int(.
2870: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
2880: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
2890: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
28a0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28c0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
28d0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
28e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
28f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2900: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
2910: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
2920: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2940: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
2950: 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20  /.  int p4      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
2970: 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20  4 operand as an 
2980: 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20  integer */.){.  
2990: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
29a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
29b0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
29c0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
29d0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
29e0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
29f0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
2a00: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
2a10: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
2a20: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34    pOp->p4.i = p4
2a30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2a40: 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72  ddr;.}../* Inser
2a50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63  t the end of a c
2a60: 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69  o-routine.*/.voi
2a70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64  d sqlite3VdbeEnd
2a80: 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a  Coroutine(Vdbe *
2a90: 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29  v, int regYield)
2aa0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
2ab0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
2ac0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
2ad0: 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  ld);..  /* Clear
2ae0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72   the temporary r
2af0: 65 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74  egister cache, t
2b00: 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20  hereby ensuring 
2b10: 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63  that each.  ** c
2b20: 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74  o-routine has it
2b30: 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e  s own independen
2b40: 74 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65  t set of registe
2b50: 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72  rs, because co-r
2b60: 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67  outines.  ** mig
2b70: 68 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20  ht expect their 
2b80: 72 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20  registers to be 
2b90: 70 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73  preserved across
2ba0: 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e   an OP_Yield, an
2bb0: 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c  d.  ** that coul
2bc0: 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73  d cause problems
2bd0: 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
2be0: 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20  co-routines are 
2bf0: 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20  using the same. 
2c00: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65   ** temporary re
2c10: 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76  gister..  */.  v
2c20: 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ->pParse->nTempR
2c30: 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61  eg = 0;.  v->pPa
2c40: 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
2c50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2c60: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
2c70: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
2c80: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
2c90: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
2ca0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
2cb0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
2cc0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
2cd0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
2ce0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
2cf0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
2d00: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
2d10: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
2d20: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
2d30: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
2d40: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
2d50: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
2d60: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
2d70: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
2d80: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
2d90: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
2da0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
2db0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
2dc0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
2dd0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
2de0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
2df0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
2e00: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
2e10: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
2e20: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
2e30: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
2e40: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
2e50: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
2e60: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
2e70: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
2e80: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
2e90: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
2ea0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
2ed0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2ee0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
2ef0: 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  v){.  Parse *p =
2f00: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
2f10: 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b  t i = p->nLabel+
2f20: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  +;.  assert( v->
2f30: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2f40: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2f50: 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29  (i & (i-1))==0 )
2f60: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  {.    p->aLabel 
2f70: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2f80: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
2f90: 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20  p->aLabel, .    
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f     (i*2+1)*sizeo
2fd0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29  f(p->aLabel[0]))
2fe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
2ff0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
3000: 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a  aLabel[i] = -1;.
3010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44    }.  return ADD
3020: 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  R(i);.}../*.** R
3030: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
3040: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
3050: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3060: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
3070: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
3080: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
3090: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
30a0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
30b0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
30c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
30d0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
30e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
30f0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  lveLabel(Vdbe *v
3100: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73  , int x){.  Pars
3110: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
3120: 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52  ;.  int j = ADDR
3130: 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  (x);.  assert( v
3140: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3150: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
3160: 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65  sert( j<p->nLabe
3170: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  l );.  assert( j
3180: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3190: 61 4c 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66  aLabel ){.#ifdef
31a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
31b0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
31c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
31d0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
31e0: 20 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f      printf("RESO
31f0: 4c 56 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20  LVE LABEL %d to 
3200: 25 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70  %d\n", x, v->nOp
3210: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
3220: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
3230: 4c 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29  Label[j]==(-1) )
3240: 3b 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20  ; /* Labels may 
3250: 6f 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64  only be resolved
3260: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e   once */.    p->
3270: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3280: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
3290: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
32a0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
32b0: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
32c0: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
32d0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
32e0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
32f0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
3300: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
3310: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
3320: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
3330: 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20  be run multiple 
3340: 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  times..*/.void s
3350: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62  qlite3VdbeReusab
3360: 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  le(Vdbe *p){.  p
3370: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
3380: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
3390: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
33a0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
33b0: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
33c0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
33d0: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
33e0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
33f0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3400: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
3410: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
3420: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
3430: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
3440: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
3450: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
3460: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
3470: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
3480: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
3490: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
34a0: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
34b0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
34c0: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
34d0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
34e0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
34f0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3510: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
3520: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
3530: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3540: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3550: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
3560: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
3570: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
3580: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3590: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
35a0: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
35b0: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
35c0: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
35d0: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
35e0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
35f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3600: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
3610: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
3620: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
3630: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
3640: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
3650: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
3660: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
3670: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
3680: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3690: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
36a0: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
36b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
36c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
36d0: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
36e0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
36f0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
3720: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
3730: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
3740: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
3750: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
3760: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
3770: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
3780: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
3790: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
37a0: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
37b0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
37c0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
37d0: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
37e0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
37f0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
3800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
3810: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
3820: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
3830: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
3840: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
3850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3860: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
3870: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
3880: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
3890: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
38a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
38b0: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
38c0: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
38d0: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
38e0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
38f0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
3900: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
3910: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
3920: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
3930: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
3940: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
3950: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3960: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
3970: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
3980: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
3990: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
39a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
39b0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
39c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
39d0: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
39e0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
39f0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
3a00: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
3a10: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
3a20: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
3a30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
3a40: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
3a50: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
3a60: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
3a70: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
3a80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3a90: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
3aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
3ab0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
3ac0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
3ad0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
3ae0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
3af0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
3b00: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
3b10: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
3b20: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
3b30: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
3b40: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
3b50: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
3b60: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
3b70: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
3b80: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
3b90: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
3ba0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
3bc0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
3bd0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3be0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3bf0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
3c00: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
3c10: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
3c20: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
3c30: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
3c40: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
3c50: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
3c60: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
3c70: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
3c80: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
3c90: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
3ca0: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20  constraint).**  
3cb0: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72   *  OP_CreateBtr
3cc0: 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  ee/BTREE_INTKEY 
3cd0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
3ce0: 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66  tine .**      (f
3cf0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
3d00: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  AS SELECT ...).*
3d10: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20  *.** Then check 
3d20: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f  that the value o
3d30: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74  f Parse.mayAbort
3d40: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a   is true if an.*
3d50: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74  * ABORT may be t
3d60: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20  hrown, or false 
3d70: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72  otherwise. Retur
3d80: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  n true if it doe
3d90: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66  s.** match, or f
3da0: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
3db0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3dc0: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
3dd0: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  used as.** part 
3de0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61  of an assert sta
3df0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f  tement in the co
3e00: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20  mpiler. Similar 
3e10: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  to:.**.**   asse
3e20: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41  rt( sqlite3VdbeA
3e30: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50  ssertMayAbort(pP
3e40: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
3e50: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29  rse->mayAbort) )
3e60: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
3e70: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
3e80: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  rt(Vdbe *v, int 
3e90: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74  mayAbort){.  int
3ea0: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20   hasAbort = 0;. 
3eb0: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65   int hasFkCounte
3ec0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  r = 0;.  int has
3ed0: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b  CreateTable = 0;
3ee0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
3ef0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
3f00: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
3f10: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
3f20: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
3f30: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
3f40: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
3f50: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
3f60: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
3f70: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
3f80: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
3f90: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
3fa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
3fb0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
3fc0: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
3fd0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
3fe0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65       || ((opcode
3ff0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63  ==OP_Halt || opc
4000: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75  ode==OP_HaltIfNu
4010: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28  ll) .      && ((
4020: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53  pOp->p1&0xff)==S
4030: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
4040: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f   && pOp->p2==OE_
4050: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20  Abort)).    ){. 
4060: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20       hasAbort = 
4070: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
4080: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70      }.    if( op
4090: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42  code==OP_CreateB
40a0: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d  tree && pOp->p3=
40b0: 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20  =BTREE_INTKEY ) 
40c0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
40d0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
40e0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
40f0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
4100: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
4110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4120: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
4130: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4140: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
4150: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
4160: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
4170: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
4180: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4190: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
41a0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
41b0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
41c0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
41d0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
41e0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
41f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
4200: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
4210: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
4220: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
4230: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
4240: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
4250: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
4260: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
4270: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
4280: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
4290: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
42a0: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
42b0: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
42c0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
42d0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
42e0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
42f0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
4300: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
4310: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
4320: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
4340: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
4350: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
4360: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
4370: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
4380: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
4390: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
43a0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  function */..#if
43b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
43c0: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
43d0: 20 74 68 65 20 6e 57 72 69 74 65 20 63 6f 75 6e   the nWrite coun
43e0: 74 65 72 20 69 6e 20 74 68 65 20 56 44 42 45 20  ter in the VDBE 
43f0: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
4400: 20 6e 6f 74 20 61 6e 0a 2a 2a 20 65 70 68 65 6d   not an.** ephem
4410: 65 72 61 6c 20 63 75 72 73 6f 72 2c 20 6f 72 20  eral cursor, or 
4420: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 72  if the cursor ar
4430: 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a  gument is NULL..
4440: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4450: 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e  dbeIncrWriteCoun
4460: 74 65 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ter(Vdbe *p, Vdb
4470: 65 43 75 72 73 6f 72 20 2a 70 43 29 7b 0a 20 20  eCursor *pC){.  
4480: 69 66 28 20 70 43 3d 3d 30 0a 20 20 20 7c 7c 20  if( pC==0.   || 
4490: 28 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43  (pC->eCurType!=C
44a0: 55 52 54 59 50 45 5f 53 4f 52 54 45 52 0a 20 20  URTYPE_SORTER.  
44b0: 20 20 20 20 20 26 26 20 70 43 2d 3e 65 43 75 72       && pC->eCur
44c0: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53  Type!=CURTYPE_PS
44d0: 45 55 44 4f 0a 20 20 20 20 20 20 20 26 26 20 21  EUDO.       && !
44e0: 70 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 29  pC->isEphemeral)
44f0: 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 57 72  .  ){.    p->nWr
4500: 69 74 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ite++;.  }.}.#en
4510: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4520: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41  TE_DEBUG./*.** A
4530: 73 73 65 72 74 20 69 66 20 61 6e 20 41 62 6f 72  ssert if an Abor
4540: 74 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  t at this point 
4550: 69 6e 20 74 69 6d 65 20 6d 69 67 68 74 20 72 65  in time might re
4560: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70  sult in a corrup
4570: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  t.** database..*
4580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4590: 62 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c  beAssertAbortabl
45a0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  e(Vdbe *p){.  as
45b0: 73 65 72 74 28 20 70 2d 3e 6e 57 72 69 74 65 3d  sert( p->nWrite=
45c0: 3d 30 20 7c 7c 20 70 2d 3e 75 73 65 73 53 74 6d  =0 || p->usesStm
45d0: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65  tJournal );.}.#e
45e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
45f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4600: 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ed after all opc
4610: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
4620: 6e 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f  nserted.  It loo
4630: 70 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  ps.** through al
4640: 6c 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e  l the opcodes an
4650: 64 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20  d fixes up some 
4660: 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28  details..**.** (
4670: 31 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70  1) For each jump
4680: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74   instruction wit
4690: 68 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  h a negative P2 
46a0: 76 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a  value (a label).
46b0: 2a 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74  **     resolve t
46c0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61  he P2 value to a
46d0: 6e 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73  n actual address
46e0: 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70  ..**.** (2) Comp
46f0: 75 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ute the maximum 
4700: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
4710: 6e 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20  nts used by any 
4720: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  SQL function.** 
4730: 20 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68      and store th
4740: 61 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61  at value in *pMa
4750: 78 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a  xFuncArgs..**.**
4760: 20 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20   (3) Update the 
4770: 56 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e  Vdbe.readOnly an
4780: 64 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72  d Vdbe.bIsReader
4790: 20 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61   flags to accura
47a0: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69  tely.**     indi
47b0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72  cate what the pr
47c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
47d0: 20 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a   actually does..
47e0: 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61  **.** (4) Initia
47f0: 6c 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76  lize the p4.xAdv
4800: 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  ance pointer on 
4810: 6f 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65  opcodes that use
4820: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52   it..**.** (5) R
4830: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
4840: 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  y allocated for 
4850: 73 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a  storing labels..
4860: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4870: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e  ne will only fun
4880: 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20  ction correctly 
4890: 69 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  if the mkopcodeh
48a0: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a  .tcl generator.*
48b0: 2a 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73  * script numbers
48c0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72   the opcodes cor
48d0: 72 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73  rectly.  Changes
48e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
48f0: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72   must be.** coor
4900: 64 69 6e 61 74 65 64 20 77 69 74 68 20 63 68 61  dinated with cha
4910: 6e 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65  nges to mkopcode
4920: 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  h.tcl..*/.static
4930: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
4940: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
4950: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
4960: 29 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  ){.  int nMaxArg
4970: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
4980: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
4990: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
49a0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
49b0: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
49c0: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
49d0: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
49e0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
49f0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
4a00: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77  p[p->nOp-1];.  w
4a10: 68 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a  hile(1){..    /*
4a20: 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64   Only JUMP opcod
4a30: 65 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74  es and the short
4a40: 20 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c   list of special
4a50: 20 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20   opcodes in the 
4a60: 73 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65  switch.    ** be
4a70: 6c 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63  low need to be c
4a80: 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65 20  onsidered.  The 
4a90: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65  mkopcodeh.tcl ge
4aa0: 6e 65 72 61 74 6f 72 20 73 63 72 69 70 74 20 67  nerator script g
4ab0: 72 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c  roups.    ** all
4ac0: 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74   these opcodes t
4ad0: 6f 67 65 74 68 65 72 20 6e 65 61 72 20 74 68 65  ogether near the
4ae0: 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70   front of the op
4af0: 63 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70  code list.  Skip
4b00: 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f  .    ** any opco
4b10: 64 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  de that does not
4b20: 20 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67   need processing
4b30: 20 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74   by virtual of t
4b40: 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20  he fact that.   
4b50: 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72   ** it is larger
4b60: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f   than SQLITE_MX_
4b70: 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20  JUMP_OPCODE, as 
4b80: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
4b90: 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20  timization..    
4ba0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  */.    if( pOp->
4bb0: 6f 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d  opcode<=SQLITE_M
4bc0: 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b  X_JUMP_OPCODE ){
4bd0: 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  .      /* NOTE: 
4be0: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
4bf0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20  e mkopcodeh.tcl 
4c00: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
4c10: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a  emoving.      **
4c20: 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73   cases from this
4c30: 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20   switch! */.    
4c40: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
4c50: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
4c60: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
4c70: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
4c80: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30    if( pOp->p2!=0
4c90: 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   ) p->readOnly =
4ca0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   0;.          /*
4cb0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
4cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4cd0: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
4ce0: 69 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  it:.        case
4cf0: 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b   OP_Savepoint: {
4d00: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49  .          p->bI
4d10: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
4d20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4d30: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
4d40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
4d50: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4d60: 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64  Checkpoint:.#end
4d70: 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  if.        case 
4d80: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
4d90: 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e     case OP_Journ
4da0: 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20  alMode: {.      
4db0: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
4dc0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
4dd0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
4de0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4df0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4e00: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74      case OP_Next
4e10: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4e20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
4e30: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
4e40: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
4e50: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
4e60: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
4e70: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
4e80: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E;.          /* 
4e90: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
4ea0: 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61  or never codes a
4eb0: 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f  ny of these opco
4ec0: 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20  des as a jump.  
4ed0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20          ** to a 
4ee0: 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65  label.  They are
4ef0: 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73   always coded as
4f00: 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64   a jump backward
4f10: 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20  s to a .        
4f20: 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65    ** known addre
4f30: 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ss */.          
4f40: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
4f50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
4f60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4f70: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4f80: 5f 50 72 65 76 3a 20 7b 0a 20 20 20 20 20 20 20  _Prev: {.       
4f90: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
4fa0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4fb0: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4fc0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4fd0: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4ff0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
5000: 6e 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20  never codes any 
5010: 6f 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73  of these opcodes
5020: 20 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20   as a jump.     
5030: 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62       ** to a lab
5040: 65 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c  el.  They are al
5050: 77 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20  ways coded as a 
5060: 6a 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74  jump backwards t
5070: 6f 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a  o a .          *
5080: 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20  * known address 
5090: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
50a0: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20  ert( pOp->p2>=0 
50b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
50c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ak;.        }.#i
50d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
50f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5100: 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20  Update: {.      
5110: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
5120: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5130: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
5140: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5160: 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65    case OP_VFilte
5170: 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  r: {.          i
5180: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
5190: 61 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70  assert( (pOp - p
51a0: 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20  ->aOp) >= 3 );. 
51b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
51c0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
51d0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
51e0: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70           n = pOp
51f0: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20  [-1].p1;.       
5200: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
5210: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
5220: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;.          /* F
5230: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
5240: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73   the default cas
5250: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23  e */.        }.#
5260: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65  endif.        de
5270: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
5280: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30     if( pOp->p2<0
5290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
52a0: 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  /* The mkopcodeh
52b0: 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20  .tcl script has 
52c0: 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e  so arranged thin
52d0: 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79  gs that the only
52e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
52f0: 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73  non-jump opcodes
5300: 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54   less than SQLIT
5310: 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61  E_MX_JUMP_CODE a
5320: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
5330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
5340: 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  have non-negativ
5350: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e  e values for P2.
5360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5370: 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33  assert( (sqlite3
5380: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
5390: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
53a0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a  FLG_JUMP)!=0 );.
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
53c0: 72 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32  rt( ADDR(pOp->p2
53d0: 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  )<pParse->nLabel
53e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
53f0: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
5400: 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b  [ADDR(pOp->p2)];
5410: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f        /* The mko
5450: 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70  pcodeh.tcl scrip
5460: 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65  t has so arrange
5470: 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68  d things that th
5480: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  e only.      ** 
5490: 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73  non-jump opcodes
54a0: 20 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54   less than SQLIT
54b0: 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61  E_MX_JUMP_CODE a
54c0: 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
54d0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e  .      ** have n
54e0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
54f0: 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20  es for P2. */.  
5500: 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c      assert( (sql
5510: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
5520: 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26  ty[pOp->opcode]&
5530: 4f 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c  OPFLG_JUMP)==0 |
5540: 7c 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20  | pOp->p2>=0);. 
5550: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
5560: 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b  ==p->aOp ) break
5570: 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d  ;.    pOp--;.  }
5580: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5590: 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  (p->db, pParse->
55a0: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73  aLabel);.  pPars
55b0: 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->aLabel = 0;. 
55c0: 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20   pParse->nLabel 
55d0: 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63  = 0;.  *pMaxFunc
55e0: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
55f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
5600: 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62  sReader!=0 || Db
5610: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
5620: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a  treeMask) );.}..
5630: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5640: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
5650: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
5660: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
5670: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5680: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
5690: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
56a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
56b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
56c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
56d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  .}../*.** Verify
56e0: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e   that at least N
56f0: 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72   opcode slots ar
5700: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  e available in p
5710: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5720: 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ng to malloc for
5730: 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63   more space (exc
5740: 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ept when compile
5750: 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  d using.** SQLIT
5760: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
5770: 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e  TRESS).  This in
5780: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
5790: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a  during testing.*
57a0: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
57b0: 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74   certain calls t
57c0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  o sqlite3VdbeAdd
57d0: 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76  OpList() can nev
57e0: 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74  er.** fail due t
57f0: 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e  o a OOM fault an
5800: 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65  d hence that the
5810: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
5820: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
5830: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c  eAddOpList() wil
5840: 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d  l always be non-
5850: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  NULL..*/.#if def
5860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5870: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
5880: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
5890: 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20  OC_STRESS).void 
58a0: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
58b0: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
58c0: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e  d(Vdbe *p, int N
58d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
58e0: 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50  nOp + N <= p->pP
58f0: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  arse->nOpAlloc )
5900: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5910: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
5920: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
5930: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5940: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5950: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
5960: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
5970: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
5980: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
5990: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
59a0: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
59b0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
59c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
59d0: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
59e0: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
59f0: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
5a00: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
5a10: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
5a20: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
5a30: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5a40: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
5a50: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
5a60: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
5a70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
5a80: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
5a90: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
5aa0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
5ab0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
5ac0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
5ad0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
5ae0: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
5af0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5b00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
5b10: 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72  a single OP_Abor
5b20: 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68  table opcode) th
5b30: 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66  at will.** verif
5b40: 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  y that the VDBE 
5b50: 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65  program can safe
5b60: 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e  ly call Abort in
5b70: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
5b80: 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20  context..*/.#if 
5b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5ba0: 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74  EBUG).void sqlit
5bb0: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
5bc0: 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69  table(Vdbe *p, i
5bd0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69  nt onError){.  i
5be0: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
5bf0: 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64  bort ) sqlite3Vd
5c00: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41  beAddOp0(p, OP_A
5c10: 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e  bortable);.}.#en
5c20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
5c30: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5c40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5c50: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
5c60: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
5c70: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
5c80: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5c90: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
5ca0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
5cb0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
5cc0: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
5cd0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
5ce0: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
5cf0: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
5d00: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
5d10: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
5d20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
5d30: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
5d40: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
5d50: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
5d60: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
5d70: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
5d80: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
5d90: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
5da0: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
5db0: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
5dc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
5dd0: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
5de0: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
5df0: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
5e00: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
5e10: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
5e20: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5e30: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
5e40: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
5e50: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
5e60: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
5e70: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
5e80: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
5e90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5ea0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
5eb0: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
5ec0: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
5ed0: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
5ee0: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
5ef0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
5f00: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
5f10: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
5f20: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
5f30: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
5f40: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
5f50: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
5f70: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
5f80: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
5f90: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
5fa0: 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   Return a.** poi
5fb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
5fc0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
5fd0: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d  rted..**.** Non-
5fe0: 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74  zero P2 argument
5ff0: 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75  s to jump instru
6000: 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d  ctions are autom
6010: 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65  atically adjuste
6020: 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  d.** so that the
6030: 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20   jump target is 
6040: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
6050: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
6060: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
6070: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6080: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
6090: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
60a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
60b0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
60c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
60d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6100: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
6110: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
6120: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
6130: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6140: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
6150: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
6180: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
6190: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
61a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
61b0: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
61c0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
61d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
61e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
61f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6200: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
6210: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
6220: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
6230: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
6240: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6250: 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75  }.  pFirst = pOu
6260: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  t = &p->aOp[p->n
6270: 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Op];.  for(i=0; 
6280: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b  i<nOp; i++, aOp+
6290: 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20  +, pOut++){.    
62a0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61  pOut->opcode = a
62b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
62c0: 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e  pOut->p1 = aOp->
62d0: 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32  p1;.    pOut->p2
62e0: 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = aOp->p2;.    
62f0: 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e  assert( aOp->p2>
6300: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73  =0 );.    if( (s
6310: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
6320: 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65  erty[aOp->opcode
6330: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  ] & OPFLG_JUMP)!
6340: 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20  =0 && aOp->p2>0 
6350: 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  ){.      pOut->p
6360: 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  2 += p->nOp;.   
6370: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20   }.    pOut->p3 
6380: 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70  = aOp->p3;.    p
6390: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
63a0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f  _NOTUSED;.    pO
63b0: 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  ut->p4.p = 0;.  
63c0: 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a    pOut->p5 = 0;.
63d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
63e0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
63f0: 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e  MENTS.    pOut->
6400: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
6410: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
6420: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6430: 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c  .    pOut->iSrcL
6440: 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b  ine = iLineno+i;
6450: 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64  .#else.    (void
6460: 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66  )iLineno;.#endif
6470: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6480: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e  EBUG.    if( p->
6490: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
64a0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
64b0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
64c0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
64d0: 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61   i+p->nOp, &p->a
64e0: 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20  Op[i+p->nOp]);. 
64f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
6500: 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b    p->nOp += nOp;
6510: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74  .  return pFirst
6520: 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
6530: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
6540: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a  TMT_SCANSTATUS).
6550: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74  /*.** Add an ent
6560: 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  ry to the array 
6570: 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61  of counters mana
6580: 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73  ged by sqlite3_s
6590: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29  tmt_scanstatus()
65a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
65b0: 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28  3VdbeScanStatus(
65c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20     /* VM to add 
65f0: 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20  scanstatus() to 
6600: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70  */.  int addrExp
6610: 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lain,           
6620: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6630: 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f  of OP_Explain (o
6640: 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  r 0) */.  int ad
6650: 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  drLoop,         
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6670: 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75  ress of loop cou
6680: 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61  nter */ .  int a
6690: 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20  ddrVisit,       
66a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
66b0: 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69  dress of rows vi
66c0: 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f  sited counter */
66d0: 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20  .  LogEst nEst, 
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
6700: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
6710: 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74   rows */.  const
6720: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
6730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6740: 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69  me of table or i
6750: 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e  ndex being scann
6760: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ed */.){.  int n
6770: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e  Byte = (p->nScan
6780: 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61  +1) * sizeof(Sca
6790: 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e  nStatus);.  Scan
67a0: 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20  Status *aNew;.  
67b0: 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74  aNew = (ScanStat
67c0: 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61  us*)sqlite3DbRea
67d0: 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lloc(p->db, p->a
67e0: 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Scan, nByte);.  
67f0: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
6800: 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77  ScanStatus *pNew
6810: 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61   = &aNew[p->nSca
6820: 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n++];.    pNew->
6830: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64  addrExplain = ad
6840: 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70  drExplain;.    p
6850: 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20  New->addrLoop = 
6860: 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e  addrLoop;.    pN
6870: 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20  ew->addrVisit = 
6880: 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70  addrVisit;.    p
6890: 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74  New->nEst = nEst
68a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ;.    pNew->zNam
68b0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
68c0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Dup(p->db, zName
68d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20  );.    p->aScan 
68e0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65  = aNew;.  }.}.#e
68f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
6900: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
6910: 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20   the opcode, or 
6920: 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50  P1, P2, P3, or P
6930: 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f  5 operands.** fo
6940: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
6950: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6960: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6970: 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  ngeOpcode(Vdbe *
6980: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20  p, u32 addr, u8 
6990: 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73  iNewOpcode){.  s
69a0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
69b0: 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20  p,addr)->opcode 
69c0: 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a  = iNewOpcode;.}.
69d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
69e0: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
69f0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
6a00: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
6a10: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
6a20: 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p1 = val;.}.vo
6a30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
6a40: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
6a50: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
6a60: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
6a70: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
6a80: 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p2 = val;.}.void
6a90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6aa0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
6ab0: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
6ac0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
6ad0: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33  etOp(p,addr)->p3
6ae0: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
6af0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6b00: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20  P5(Vdbe *p, u16 
6b10: 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  p5){.  assert( p
6b20: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62  ->nOp>0 || p->db
6b30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6b40: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  ;.  if( p->nOp>0
6b50: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70   ) p->aOp[p->nOp
6b60: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a  -1].p5 = p5;.}..
6b70: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6b80: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
6b90: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
6ba0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
6bb0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
6bc0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
6bd0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
6be0: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
6bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6c00: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
6c10: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
6c20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
6c30: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
6c40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6c50: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
6c60: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
6c70: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
6c80: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
6c90: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
6ca0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
6cb0: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
6cc0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
6cd0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
6ce0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
6cf0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
6d00: 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
6d10: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
6d20: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
6d30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6d40: 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20  NN(db, pDef);.  
6d50: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
6d60: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
6d70: 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a  (sqlite3 *, Op *
6d80: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  , int);../*.** D
6d90: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
6da0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6db0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
6dc0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
6dd0: 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20  eeP4Mem(sqlite3 
6de0: 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20  *db, Mem *p){.  
6df0: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
6e00: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
6e10: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
6e20: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
6e30: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
6e40: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
6e50: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46  INE void freeP4F
6e60: 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a  uncCtx(sqlite3 *
6e70: 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  db, sqlite3_cont
6e80: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45  ext *p){.  freeE
6e90: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
6ea0: 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a  (db, p->pFunc);.
6eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
6ec0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  (db, p);.}.stati
6ed0: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
6ee0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
6ef0: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
6f00: 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  {.  assert( db )
6f10: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79  ;.  switch( p4ty
6f20: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
6f30: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
6f40: 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78     freeP4FuncCtx
6f50: 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f  (db, (sqlite3_co
6f60: 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20  ntext*)p4);.    
6f70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6f80: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
6f90: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6fa0: 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  64:.    case P4_
6fb0: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73  DYNAMIC:.    cas
6fc0: 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20  e P4_DYNBLOB:.  
6fd0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6fe0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6ff0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
7000: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7010: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7020: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7030: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
7040: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
7050: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
7060: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
7070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7080: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7090: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
70a0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
70b0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
70c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
70d0: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
70e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
70f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
7100: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7110: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
7120: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
7130: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
7140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7150: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7160: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
7170: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7180: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
7190: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
71a0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
71b0: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
71c0: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
71d0: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
71e0: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
71f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7200: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
7210: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7220: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7230: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
7240: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
7250: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7270: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
7280: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
7290: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
72a0: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
72b0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
72c0: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
72d0: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
72e0: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
72f0: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
7300: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
7310: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
7320: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
7330: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
7340: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
7350: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
7360: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
7370: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
7380: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
7390: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
73a0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
73b0: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
73c0: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
73d0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
73e0: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
73f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7400: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
7410: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7420: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
7430: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
7440: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7450: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
7460: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7470: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
7480: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
7490: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
74a0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
74b0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
74c0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
74d0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
74e0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
74f0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
7500: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
7510: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
7520: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
7530: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7540: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
7550: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
7560: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
7570: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
7580: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
7590: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
75a0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
75b0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
75c0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
75d0: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
75e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
75f0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
7600: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
7610: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
7620: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
7640: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
7650: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
7660: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
7670: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
7680: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
7690: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
76a0: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
76b0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
76c0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
76d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
76e0: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
76f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
7700: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
7710: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
7720: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
7730: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
7740: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
7750: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
7760: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
7770: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
7780: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7790: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
77a0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
77b0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
77c0: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
77d0: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
77e0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
77f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7800: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
7810: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
7820: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7840: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
7850: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
7860: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
7870: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
7880: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
7890: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
78a0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
78b0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
78c0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
78d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
78e0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
78f0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
7900: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
7910: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
7920: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
7930: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
7940: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
7950: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
7960: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
7970: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
7980: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
7990: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
79a0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
79b0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
79c0: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
79d0: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
79e0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
79f0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
7a00: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
7a10: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
7a20: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
7a30: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
7a40: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
7a50: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
7a60: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
7a70: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
7a80: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
7a90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
7aa0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
7ab0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
7ac0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
7ad0: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
7ae0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
7af0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
7b00: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
7b10: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
7b20: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
7b30: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
7b40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
7b50: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
7b60: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
7b70: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
7b80: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
7b90: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
7ba0: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
7bb0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
7bc0: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
7bd0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
7be0: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
7bf0: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
7c00: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
7c10: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
7c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7c30: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
7c40: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
7c50: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
7c60: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
7c70: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7c80: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
7c90: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
7ca0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
7cb0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
7cc0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
7cd0: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
7ce0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7cf0: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
7d00: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
7d10: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
7d20: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
7d30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
7d40: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
7d50: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7d60: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
7d70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
7d80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7d90: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
7da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7db0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7dc0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
7dd0: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
7de0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
7df0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
7e00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7e10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
7e20: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
7e30: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
7e40: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
7e50: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
7e60: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
7e70: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
7e80: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
7e90: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
7ea0: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
7eb0: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
7ec0: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
7ed0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
7ee0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
7ef0: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
7f00: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
7f10: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
7f20: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
7f30: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
7f40: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
7f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
7f60: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
7f70: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
7f80: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
7f90: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
7fa0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
7fb0: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
7fc0: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
7fd0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
7fe0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
7ff0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
8000: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
8010: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
8020: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
8030: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
8040: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8050: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
8060: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
8070: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
8080: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
8090: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
80a0: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
80b0: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
80c0: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
80d0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
80e0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
80f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
8100: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
8110: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
8120: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
8130: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
8140: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
8150: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
8160: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
8170: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
8180: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
8190: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
81a0: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
81b0: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
81c0: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
81d0: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
81e0: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
81f0: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
8200: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
8210: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
8220: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
8230: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
8240: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
8250: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
8260: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8270: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
8280: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
8290: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
82a0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
82b0: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
82c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
82d0: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
82e0: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
82f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8300: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8310: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
8320: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
8330: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
8340: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
8350: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
8360: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
8370: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
8380: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
8390: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
83a0: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
83b0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
83c0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
83d0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
83e0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
83f0: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
8400: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
8410: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
8420: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
8430: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
8440: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
8450: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8460: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
8470: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
8480: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
8490: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
84a0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
84b0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
84c0: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
84d0: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
84e0: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
84f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
8500: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
8510: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
8520: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
8530: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
8540: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
8550: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
8560: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
8570: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
8580: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8590: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
85a0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
85b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
85c0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
85d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
85e0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
85f0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
8600: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
8610: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8620: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
8630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
8640: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
8650: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
8660: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
8670: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
8680: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
8690: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
86a0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
86b0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
86c0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
86d0: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
86e0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
86f0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
8700: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
8710: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
8720: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
8730: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
8740: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
8750: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
8760: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
8770: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
8780: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
8790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
87a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
87b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
87c0: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
87d0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
87e0: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
87f0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8800: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
8810: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
8820: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
8830: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
8840: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
8850: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8860: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
8870: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
8880: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
8890: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
88a0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
88b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
88c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
88d0: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
88e0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
88f0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
8900: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
8910: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
8920: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8930: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
8940: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
8950: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
8960: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
8970: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
8980: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
8990: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
89a0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
89b0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
89c0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
89d0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
89e0: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
89f0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
8a00: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
8a10: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
8a20: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
8a30: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
8a40: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
8a50: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
8a60: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
8a70: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
8a80: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
8a90: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
8aa0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
8ab0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
8ac0: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
8ad0: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
8ae0: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
8af0: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
8b00: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
8b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
8b20: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
8b30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8b40: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
8b50: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
8b60: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
8b70: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
8b80: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
8b90: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
8ba0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
8bb0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
8bc0: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
8bd0: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
8be0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
8bf0: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
8c00: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
8c10: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
8c20: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
8c30: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
8c40: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
8c50: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
8c60: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
8c70: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
8c80: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
8c90: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
8ca0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
8cb0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
8cc0: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
8cd0: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
8ce0: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
8cf0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8d00: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
8d10: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
8d20: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
8d30: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
8d40: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
8d50: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
8d60: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
8d70: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8d80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8d90: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
8da0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
8db0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
8dc0: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
8dd0: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
8de0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8df0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8e00: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
8e10: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
8e20: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
8e30: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
8e40: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
8e50: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
8e60: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
8e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
8e80: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
8e90: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
8ea0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
8eb0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
8ec0: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
8ed0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
8ee0: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
8ef0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
8f00: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
8f10: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
8f20: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
8f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8f40: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
8f50: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
8f60: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
8f70: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
8f80: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
8f90: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
8fa0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
8fb0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
8fc0: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
8fd0: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
8fe0: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
8ff0: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
9000: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
9010: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
9020: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
9030: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
9040: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
9050: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
9060: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
9070: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
9080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
9090: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
90a0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
90b0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
90c0: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
90d0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
90e0: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
90f0: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
9100: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
9110: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
9120: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
9130: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
9140: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9150: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
9160: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
9170: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
9180: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
9190: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
91a0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
91b0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
91c0: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
91d0: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
91e0: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
91f0: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
9200: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
9210: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
9220: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9230: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
9240: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
9250: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
9260: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9270: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
9280: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
9290: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
92a0: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
92b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
92c0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
92d0: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
92e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
92f0: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
9300: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
9310: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
9320: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
9330: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
9340: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
9350: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
9360: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9370: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
9380: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
9390: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
93a0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
93b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
93c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
93d0: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
93e0: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
93f0: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9410: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9420: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9430: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
9440: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
9450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9460: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
9470: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
9480: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
9490: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
94a0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
94b0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
94c0: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
94d0: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
94e0: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
94f0: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
9500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9510: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
9520: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
9530: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
9540: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
9550: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9560: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9570: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9580: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
9590: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
95a0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
95b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
95c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
95d0: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
95e0: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
95f0: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
9600: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9610: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
9620: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
9630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
9640: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
9650: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
9660: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9670: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
9680: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
9690: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
96a0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
96b0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
96c0: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
96d0: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
96e0: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
96f0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
9700: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
9720: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
9730: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
9740: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9750: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
9760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9770: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9780: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9790: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
97a0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
97b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
97c0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
97d0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
97e0: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
97f0: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
9800: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
9810: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
9820: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9830: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
9840: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
9850: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9860: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
9870: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
9880: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
9890: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
98a0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
98b0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
98c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
98d0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
98e0: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
98f0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
9900: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
9910: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
9920: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
9930: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
9940: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
9950: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
9960: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
9970: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9980: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
9990: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
99a0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
99b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
99c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
99d0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
99e0: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
99f0: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
9a00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
9a10: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
9a20: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
9a30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9a40: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
9a50: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
9a60: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
9a70: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
9a80: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
9a90: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
9aa0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
9ab0: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
9ac0: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
9ad0: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
9ae0: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
9af0: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
9b00: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
9b10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9b20: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
9b30: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9b40: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
9b50: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
9b60: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
9b70: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
9b80: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
9b90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9ba0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
9bb0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
9bc0: 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78  ndf(p, "%d", pEx
9bd0: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
9be0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9bf0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
9c10: 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c  appendf(p, "NULL
9c20: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
9c30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
9c40: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
9c50: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
9c60: 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  df(p, "r[%d]", p
9c70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
9c80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c90: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
9ca0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
9cb0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9cc0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
9cd0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
9ce0: 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  f(p, "rowid");. 
9cf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
9d10: 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22  appendf(p, "c%d"
9d20: 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43  , (int)pExpr->iC
9d30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
9d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9d50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
9d60: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  T:      zOp = "L
9d70: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
9d80: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
9d90: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b       zOp = "LE";
9da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9db0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
9dc0: 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20    zOp = "GT";   
9dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9de0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
9df0: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20  Op = "GE";      
9e00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9e10: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_NE:      zOp 
9e20: 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65  = "NE";      bre
9e30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e40: 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  EQ:      zOp = "
9e50: 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  EQ";      break;
9e60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
9e70: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22        zOp = "IS"
9e80: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9e90: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
9ea0: 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22     zOp = "ISNOT"
9eb0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9ec0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
9ed0: 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  zOp = "AND";    
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ef0: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70   TK_OR:      zOp
9f00: 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72   = "OR";      br
9f10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9f20: 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20  _PLUS:    zOp = 
9f30: 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "ADD";     break
9f40: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
9f50: 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55  AR:    zOp = "MU
9f60: 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
9f70: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
9f80: 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b  :   zOp = "SUB";
9f90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9fa0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
9fb0: 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20   zOp = "REM";   
9fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9fd0: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f  e TK_BITAND:  zO
9fe0: 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62  p = "BITAND";  b
9ff0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a000: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d  K_BITOR:   zOp =
a010: 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61   "BITOR";   brea
a020: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
a030: 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44  LASH:   zOp = "D
a040: 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IV";     break;.
a050: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
a060: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49  FT:  zOp = "LSHI
a070: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
a080: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
a090: 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22    zOp = "RSHIFT"
a0a0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
a0b0: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
a0c0: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20  Op = "CONCAT";  
a0d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a0e0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20  TK_UMINUS:  zOp 
a0f0: 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65  = "MINUS";   bre
a100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a110: 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  UPLUS:   zOp = "
a120: 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b  PLUS";    break;
a130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a140: 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  NOT:  zOp = "BIT
a150: 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
a160: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
a170: 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20     zOp = "NOT"; 
a180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a190: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
a1a0: 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  zOp = "ISNULL"; 
a1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a1c0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70   TK_NOTNULL: zOp
a1d0: 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
a1e0: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
a1f0: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
a200: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a210: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
a220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a230: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
a240: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a250: 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20  pendf(p, "%s(", 
a260: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
a270: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
a280: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
a290: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
a2a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a2b0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
a2c0: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
a2d0: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
a2e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a2f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a300: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
a310: 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  )", 1);.  }.}.#e
a320: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
a330: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
a340: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
a350: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a  _CURSOR_HINTS) *
a360: 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  /...#if VDBE_DIS
a370: 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f  PLAY_P4./*.** Co
a380: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
a390: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
a3a0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
a3b0: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
a3c0: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
a3d0: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
a3e0: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
a3f0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
a400: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
a410: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
a420: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
a430: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
a440: 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  emp;.  StrAccum 
a450: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  x;.  assert( nTe
a460: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69  mp>=20 );.  sqli
a470: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
a480: 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54  &x, 0, zTemp, nT
a490: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63  emp, 0);.  switc
a4a0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
a4b0: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
a4c0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
a4d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  nt j;.      KeyI
a4e0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
a4f0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
a500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a510: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
a520: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
a530: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a540: 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  endf(&x, "k(%d",
a550: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
a560: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ield);.      for
a570: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
a580: 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b  ->nKeyField; j++
a590: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
a5a0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
a5b0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
a5c0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a5d0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
a5e0: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
a5f0: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
a600: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
a610: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
a620: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
a630: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a640: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25  _appendf(&x, ",%
a650: 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%s", .         
a660: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
a670: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20  aSortOrder[j] ? 
a680: 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29  "-" : "", zColl)
a690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a6a0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a6b0: 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a  nd(&x, ")", 1);.
a6c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a6d0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a6e0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
a6f0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
a700: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
a710: 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c  isplayP4Expr(&x,
a720: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b   pOp->p4.pExpr);
a730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a740: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
a750: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
a760: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
a770: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
a780: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
a790: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a7a0: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
a7b0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
a7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
a7e0: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
a7f0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
a800: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
a810: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a820: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
a830: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
a840: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
a850: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a860: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
a870: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
a880: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
a890: 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20  OFILE).    case 
a8a0: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
a8b0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
a8c0: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
a8d0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
a8e0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a8f0: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
a900: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
a910: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
a920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
a930: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
a940: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
a950: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a960: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
a970: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
a980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a990: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
a9a0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
a9b0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a9c0: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
a9d0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
a9e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a9f0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
aa00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
aa10: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
aa20: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
aa30: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
aa40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
aa50: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
aa60: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
aa70: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
aa80: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
aa90: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
aaa0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
aab0: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
aac0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
aad0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
aae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
aaf0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
ab00: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
ab10: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
ab20: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
ab30: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
ab40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
ab50: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
ab60: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
ab70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ab80: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
ab90: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
aba0: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
abb0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
abc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
abe0: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
abf0: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
ac00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ac10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ac20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ac30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ac40: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
ac50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ac60: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
ac70: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
ac80: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
ac90: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
aca0: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
acb0: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
acc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
acd0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
ace0: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
acf0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
ad00: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
ad10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
ad20: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
ad30: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
ad40: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
ad50: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
ad80: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
ad90: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
ada0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
adb0: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <=n; i++){.     
adc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
add0: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22  ppendf(&x, ",%d"
ade0: 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ai[i]);.      
adf0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  }.      zTemp[0]
ae00: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71   = '[';.      sq
ae10: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
ae20: 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20  (&x, "]", 1);.  
ae30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ae40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
ae50: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
ae60: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ae70: 65 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61  endf(&x, "progra
ae80: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
ae90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
aea0: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
aeb0: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
aec0: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
aed0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
aee0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
aef0: 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a  ase P4_TABLE: {.
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
af10: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
af20: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  s", pOp->p4.pTab
af30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
af40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
af50: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
af60: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
af70: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
af80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
af90: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
afa0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
afb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
afc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
afd0: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
afe0: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
aff0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
b000: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
b010: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
b020: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
b030: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
b040: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
b050: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
b060: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
b070: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
b080: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
b090: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
b0a0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
b0b0: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
b0c0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
b0d0: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
b0e0: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
b0f0: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
b100: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
b110: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
b120: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
b130: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
b140: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
b150: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
b160: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
b170: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
b180: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
b190: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
b1a0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
b1b0: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
b1c0: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
b1d0: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
b1e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
b1f0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
b200: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
b210: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
b220: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
b230: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
b240: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
b250: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
b260: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
b270: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
b280: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
b290: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b2a0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
b2b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  E)./*.** If SQLi
b2c0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
b2d0: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
b2e0: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
b2f0: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
b300: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
b310: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
b320: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
b330: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
b340: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
b350: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
b360: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
b370: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
b380: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
b390: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
b3a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
b3b0: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
b3c0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
b3d0: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
b3e0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
b3f0: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
b400: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
b410: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
b420: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
b430: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
b440: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
b450: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
b460: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
b470: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
b480: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
b490: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
b4a0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
b4b0: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
b4c0: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
b4d0: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
b4e0: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
b4f0: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
b500: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b510: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
b520: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
b530: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
b540: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
b550: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
b560: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
b570: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
b580: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
b590: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
b5a0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
b5b0: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
b5c0: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
b5d0: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
b5e0: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
b5f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
b600: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
b610: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
b620: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
b630: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
b640: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
b650: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
b660: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
b670: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
b680: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
b690: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
b6a0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
b6b0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
b6c0: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
b6d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
b6e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
b6f0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
b700: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
b710: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
b720: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
b730: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
b740: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
b750: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
b760: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
b770: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
b780: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
b790: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
b7a0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
b7b0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
b7c0: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
b7d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b7e0: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
b7f0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
b800: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
b810: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b820: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
b830: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
b840: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
b850: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
b860: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
b870: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
b880: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b890: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
b8a0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
b8b0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
b8c0: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
b8d0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
b8e0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
b8f0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
b900: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
b910: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
b920: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
b930: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
b940: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
b950: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
b960: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
b970: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
b980: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
b990: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b9a0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
b9b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
b9c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
b9d0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
b9e0: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
b9f0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
ba00: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
ba10: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
ba20: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
ba30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
ba40: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
ba50: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
ba60: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
ba70: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
ba80: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
ba90: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
baa0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
bab0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
bac0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
bad0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
bae0: 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a  , VdbeOp *pOp){.
baf0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
bb00: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
bb10: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
bb20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
bb30: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
bb40: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
bb50: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
bb60: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
bb70: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
bb80: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
bb90: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
bba0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
bbb0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
bbc0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
bbd0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
bbe0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
bbf0: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
bc00: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
bc10: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
bc20: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
bc30: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
bc40: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
bc50: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
bc60: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
bc70: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
bc80: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
bc90: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
bca0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
bcb0: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
bcc0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
bcd0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
bce0: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
bcf0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
bd00: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
bd10: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
bd20: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
bd30: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
bd40: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
bd50: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
bd60: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
bd70: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
bd80: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
bd90: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
bda0: 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   element..*/.sta
bdb0: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d  tic void initMem
bdc0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
bdd0: 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  t N, sqlite3 *db
bde0: 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20  , u16 flags){.  
bdf0: 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29  while( (N--)>0 )
be00: 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  {.    p->db = db
be10: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
be20: 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73   flags;.    p->s
be30: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66  zMalloc = 0;.#if
be40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
be50: 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72  .    p->pScopyFr
be60: 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  om = 0;.#endif. 
be70: 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f     p++;.  }.}../
be80: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
be90: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
bea0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
beb0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
bec0: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
bed0: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
bee0: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
bef0: 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20  pEnd = &p[N];.  
bf00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bf10: 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64  p->db;.    if( d
bf20: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
bf30: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
bf40: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
bf50: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
bf60: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
bf70: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  loc);.      }whi
bf80: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
bf90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
bfa0: 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
bfb0: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
bfc0: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
bfd0: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
bfe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
bff0: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
c000: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
c010: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
c020: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
c030: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
c040: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
c050: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
c060: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
c070: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
c080: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
c090: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
c0a0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
c0b0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
c0c0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
c0d0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
c0e0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
c0f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
c100: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
c110: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
c120: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
c130: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
c140: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
c150: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
c160: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
c170: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
c180: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
c190: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
c1a0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
c1b0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
c1c0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
c1d0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
c1e0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
c1f0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
c200: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
c210: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
c220: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
c230: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
c240: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
c250: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
c260: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
c270: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
c280: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
c290: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
c2a0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
c2b0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
c2c0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
c2d0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
c2e0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
c2f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
c300: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
c310: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c320: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
c330: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
c340: 73 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d  stcase( p->xDel=
c350: 3d 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d  =sqlite3VdbeFram
c360: 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20  eMemDel );.     
c370: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
c380: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20  EM_Agg|MEM_Dyn) 
c390: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c3a0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
c3b0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
c3c0: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
c3d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c3e0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
c3f0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
c400: 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63       p->szMalloc
c410: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
c420: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
c430: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
c440: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
c450: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  <pEnd );.  }.}..
c460: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
c470: 42 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  BUG./*.** Verify
c480: 20 74 68 61 74 20 70 46 72 61 6d 65 20 69 73 20   that pFrame is 
c490: 61 20 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d  a valid VdbeFram
c4a0: 65 20 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75  e pointer.  Retu
c4b0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
c4c0: 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66  .** and false if
c4d0: 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72   something is wr
c4e0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ong..**.** This 
c4f0: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e  routine is inten
c500: 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69  ded for use insi
c510: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
c520: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a  tatements only..
c530: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c540: 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56  beFrameIsValid(V
c550: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
c560: 29 7b 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d  ){.  if( pFrame-
c570: 3e 69 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51  >iFrameMagic!=SQ
c580: 4c 49 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43  LITE_FRAME_MAGIC
c590: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
c5a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
c5b0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  f.../*.** This i
c5c0: 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f  s a destructor o
c5d0: 6e 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28  n a Mem object (
c5e0: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
c5f0: 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
c600: 29 0a 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65  ).** that delete
c610: 73 20 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65  s the Frame obje
c620: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
c630: 68 65 64 20 74 6f 20 69 74 20 61 73 20 61 20 62  hed to it as a b
c640: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lob..**.** This 
c650: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
c660: 20 64 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d   delete the Fram
c670: 65 20 72 69 67 68 74 20 61 77 61 79 2e 20 20 49  e right away.  I
c680: 74 20 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68  t merely adds th
c690: 65 0a 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20  e.** frame to a 
c6a0: 6c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  list of frames t
c6b0: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  o be deleted whe
c6c0: 6e 20 74 68 65 20 56 64 62 65 20 68 61 6c 74 73  n the Vdbe halts
c6d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c6e0: 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c  3VdbeFrameMemDel
c6f0: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
c700: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
c710: 65 20 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29  e = (VdbeFrame*)
c720: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
c730: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
c740: 49 73 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20  IsValid(pFrame) 
c750: 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61  );.  pFrame->pPa
c760: 72 65 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76  rent = pFrame->v
c770: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70  ->pDelFrame;.  p
c780: 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72  Frame->v->pDelFr
c790: 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a  ame = pFrame;.}.
c7a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
c7b0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
c7c0: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
c7d0: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
c7e0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
c7f0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
c800: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
c810: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
c820: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
c830: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
c840: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
c850: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
c860: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
c870: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
c880: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
c890: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
c8a0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
c8b0: 64 4d 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28  dMem];.  assert(
c8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
c8d0: 65 49 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20  eIsValid(p) );. 
c8e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
c8f0: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
c900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
c910: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
c920: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
c930: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
c940: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
c950: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Mem);.  sqlite3V
c960: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
c970: 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70  (p->v->db, &p->p
c980: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
c990: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
c9a0: 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d  (p->v->db, p);.}
c9b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c9c0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
c9d0: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
c9e0: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
c9f0: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
ca00: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
ca10: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
ca20: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
ca30: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
ca40: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
ca50: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
ca60: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
ca70: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
ca80: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
ca90: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
caa0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
cab0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
cac0: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
cad0: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
cae0: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
caf0: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
cb00: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
cb10: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
cb20: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
cb30: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
cb40: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
cb50: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
cb60: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
cb70: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
cb80: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
cb90: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
cba0: 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30   PLAN..** 2018-0
cbb0: 34 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70  4-24:  In p->exp
cbc0: 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68  lain==2 mode, th
cbd0: 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65  e OP_Init opcode
cbe0: 73 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a  s of triggers.**
cbf0: 20 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c   are also shown,
cc00: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75   so that the bou
cc10: 6e 64 61 72 69 65 73 20 62 65 74 77 65 65 6e 20  ndaries between 
cc20: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
cc30: 20 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69   and.** each tri
cc40: 67 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a  gger are clear..
cc50: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
cc60: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
cc70: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
cc80: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
cc90: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
cca0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
ccb0: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
ccc0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
ccd0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
cce0: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd00: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
cd10: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
cd40: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
cd50: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
cd60: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cd90: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
cda0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
cdb0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
cdc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cdd0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
cde0: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
cdf0: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
ce20: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
ce30: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
ce40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
ce50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
ce60: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
ce70: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
ce80: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ceb0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
cec0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
cef0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
cf00: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
cf10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
cf20: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
cf30: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62  t set */.  int b
cf40: 4c 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28  ListSubprogs = (
cf50: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c  p->explain==1 ||
cf60: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
cf70: 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51 50 29  LITE_TriggerEQP)
cf80: 21 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20  !=0);.  Op *pOp 
cf90: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
cfa0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
cfb0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
cfc0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
cfd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
cfe0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
cff0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
d000: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
d010: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
d020: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
d030: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
d040: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
d050: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
d060: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
d070: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
d080: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
d090: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
d0a0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
d0b0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
d0c0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
d0d0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
d0e0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
d0f0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
d100: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
d110: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
d120: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
d130: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
d140: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
d150: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
d160: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
d170: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
d180: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
d190: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
d1a0: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
d1b0: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
d1c0: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
d1d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d1e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
d1f0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
d200: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
d210: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
d220: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
d230: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
d240: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
d250: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
d260: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d270: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
d280: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
d290: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
d2a0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
d2b0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
d2c0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
d2d0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
d2e0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
d2f0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
d300: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
d310: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
d320: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
d330: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
d340: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
d350: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
d360: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
d370: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
d380: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
d390: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
d3a0: 70 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75  p;.  if( bListSu
d3b0: 62 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a  bprogs ){.    /*
d3c0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
d3d0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
d3e0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
d3f0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
d400: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
d410: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
d420: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
d430: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
d440: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
d450: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
d460: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
d470: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
d480: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
d490: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
d4a0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
d4b0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
d4c0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
d4d0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
d4e0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
d4f0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
d500: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
d510: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
d520: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
d530: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
d540: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
d550: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
d560: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
d570: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
d580: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
d590: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
d5a0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
d5b0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
d5c0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
d5d0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
d5e0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
d5f0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
d600: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
d610: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
d620: 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31  }.  }..  while(1
d630: 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74  ){  /* Loop exit
d640: 73 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20  s via break */. 
d650: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
d660: 20 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20      if( i>=nRow 
d670: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
d680: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d690: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
d6a0: 4e 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  NE;.      break;
d6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d6c0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
d6d0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
d6e0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
d6f0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
d700: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
d710: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
d720: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
d730: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
d740: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
d750: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
d760: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
d770: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
d780: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
d790: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
d7a0: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
d7b0: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
d7c0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
d7d0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
d7e0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
d7f0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
d800: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
d810: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
d820: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
d830: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
d840: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
d850: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68      }..    /* Wh
d860: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
d870: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
d880: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
d890: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
d8a0: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
d8b0: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
d8c0: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
d8d0: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
d8e0: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
d8f0: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
d900: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
d910: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
d920: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
d930: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
d940: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
d950: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
d960: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69    */.    if( bLi
d970: 73 74 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f  stSubprogs && pO
d980: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
d990: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
d9a0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
d9b0: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
d9c0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
d9d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
d9e0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
d9f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
da00: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
da10: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
da20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
da30: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
da40: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
da50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
da60: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
da70: 65 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20  e, nSub!=0);.   
da80: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
da90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
daa0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
dab0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
dac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dad0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53     }.        apS
dae0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
daf0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
db00: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
db10: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
db20: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70  ogram;.        p
db30: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Sub->flags |= ME
db40: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  M_Blob;.        
db50: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
db60: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
db70: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77  *);.        nRow
db80: 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f   += pOp->p4.pPro
db90: 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  gram->nOp;.     
dba0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
dbb0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20   p->explain<2 ) 
dbc0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
dbd0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
dbe0: 78 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a  xplain ) break;.
dbf0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
dc00: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
dc10: 70 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b  p->pc>1 ) break;
dc20: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
dc30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dc40: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
dc50: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
dc60: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
dc70: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
dc80: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
dc90: 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
dca0: 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
dcb0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
dcc0: 3e 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >rc));.    }else
dcd0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
dce0: 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  4;.      if( p->
dcf0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
dd00: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
dd10: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
dd20: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
dd30: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
dd60: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  unter */.       
dd70: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20   pMem++;.    .  
dd80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
dd90: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
dda0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
ddb0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
ddc0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
ddd0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
dde0: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
ddf0: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ode */.        a
de00: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
de10: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 );.        pMe
de20: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
de30: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
de40: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
de50: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
de60: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ;.        pMem++
de70: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
de80: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
de90: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
dea0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
deb0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ded0: 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  1 */.      pMem+
dee0: 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  +;..      pMem->
def0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
df00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
df10: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
df40: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
df50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
df60: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
df70: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
df80: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dfa0: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P3 */.      pMe
dfb0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m++;..      if( 
dfc0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
dfd0: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
dfe0: 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34  m, 100) ){ /* P4
dff0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
e000: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
e010: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
e020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e030: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
e040: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e050: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
e060: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20  Term;.      zP4 
e070: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
e080: 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e   pMem->z, pMem->
e090: 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  szMalloc);.     
e0a0: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
e0b0: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  z ){.        pMe
e0c0: 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
e0d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
e0e0: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34  SetStr(pMem, zP4
e0f0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
e100: 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  8, 0);.      }el
e110: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
e120: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
e130: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
e140: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
e150: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
e160: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
e170: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
e180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
e190: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m++;..      if( 
e1a0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
e1b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
e1c0: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
e1d0: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
e1e0: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4) ){.          
e1f0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
e200: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e220: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
e230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e240: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
e250: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
e260: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
e270: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 2;.        sql
e280: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
e290: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
e2a0: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
e2b0: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70   P5 */.        p
e2c0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
e2d0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20  E_UTF8;.        
e2e0: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66  pMem++;.    .#if
e2f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e300: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
e310: 54 53 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  TS.        if( s
e320: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
e330: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
e340: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
e350: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
e360: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
e380: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e3a0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e3b0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
e3c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
e3d0: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
e3e0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
e3f0: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
e400: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
e410: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
e420: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65  else.        pMe
e430: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
e440: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
e450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
e460: 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  mment */.#endif.
e470: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
e480: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
e490: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
e4a0: 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  -1);.      p->pR
e4b0: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
e4c0: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d  Mem[1];.      p-
e4d0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
e4e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e4f0: 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20  TE_ROW;.    }.  
e500: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e510: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e520: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
e530: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
e540: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
e550: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
e560: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
e570: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
e580: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
e590: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
e5a0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e  (Vdbe *p){.  con
e5b0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  st char *z = 0;.
e5c0: 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
e5d0: 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c  .    z = p->zSql
e5e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
e5f0: 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63  >nOp>=1 ){.    c
e600: 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70  onst VdbeOp *pOp
e610: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
e620: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
e630: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
e640: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
e650: 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34       z = pOp->p4
e660: 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  .z;.      while(
e670: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
e680: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
e690: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70  .  }.  if( z ) p
e6a0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
e6b0: 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69  \n", z);.}.#endi
e6c0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
e6d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
e6e0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
e6f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
e700: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
e710: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
e720: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
e730: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
e740: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
e750: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
e760: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
e770: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
e780: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
e790: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
e7a0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
e7b0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
e7c0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
e7d0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e7e0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
e7f0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
e800: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
e810: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
e820: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e830: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
e840: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
e850: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
e860: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
e870: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
e880: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
e890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e8a0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
e8b0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
e8c0: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
e8d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
e8e0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
e8f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e900: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
e910: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
e920: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
e930: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
e940: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
e950: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
e960: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
e970: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
e980: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
e990: 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e  ACE */../* An in
e9a0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
e9b0: 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
e9c0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  bulk memory avai
e9d0: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  lable for use.**
e9e0: 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74   by subcomponent
e9f0: 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  s of a prepared 
ea00: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63  statement.  Spac
ea10: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  e is allocated o
ea20: 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61  ut.** of a Reusa
ea30: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20  bleSpace object 
ea40: 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63  by the allocSpac
ea50: 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f  e() routine belo
ea60: 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75  w..*/.struct Reu
ea70: 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75  sableSpace {.  u
ea80: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
ea90: 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65      /* Available
eaa0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
eab0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
eac0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76    /* Bytes of av
ead0: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a  ailable memory *
eae0: 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b  /.  int nNeeded;
eaf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
eb00: 6c 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75  l bytes that cou
eb10: 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61  ld not be alloca
eb20: 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72  ted */.};../* Tr
eb30: 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42  y to allocate nB
eb40: 79 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62  yte bytes of 8-b
eb50: 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b  yte aligned bulk
eb60: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66   memory for pBuf
eb70: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75  .** from the Reu
eb80: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
eb90: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
eba0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
ebb0: 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20  cated.** memory 
ebc0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
ebd0: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d  insufficient mem
ebe0: 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ory is available
ebf0: 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61   in the.** Reusa
ec00: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c  bleSpace object,
ec10: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65   increase the Re
ec20: 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65  usableSpace.nNee
ec30: 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20  ded.** value by 
ec40: 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65  the amount neede
ec50: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
ec60: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66  L..**.** If pBuf
ec70: 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c   is not initiall
ec80: 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61  y NULL, that mea
ec90: 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ns that the memo
eca0: 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  ry has already.*
ecb0: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
ecc0: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
ecd0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
ece0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
ecf0: 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42   a copy.** of pB
ed00: 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75  uf and leave Reu
ed10: 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61  sableSpace uncha
ed20: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nged..**.** This
ed30: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d   allocator is em
ed40: 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70  ployed to repurp
ed50: 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73  ose unused slots
ed60: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ed70: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72  he.** opcode arr
ed80: 61 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73  ay of prepared s
ed90: 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d  tate for other m
eda0: 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74  emory needs of t
edb0: 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  he prepared.** s
edc0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
edd0: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
ede0: 70 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52  pace(.  struct R
edf0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c  eusableSpace *p,
ee00: 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79    /* Bulk memory
ee10: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
ee20: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76  llocation */.  v
ee30: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
ee40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
ee50: 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61  ter to a prior a
ee60: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  llocation */.  i
ee70: 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
ee80: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
ee90: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64  s of memory need
eea0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
eeb0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
eec0: 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63  IGNMENT(p->pSpac
eed0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  e) );.  if( pBuf
eee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ==0 ){.    nByte
eef0: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
ef00: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
ef10: 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  <= p->nFree ){. 
ef20: 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d       p->nFree -=
ef30: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42   nByte;.      pB
ef40: 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b  uf = &p->pSpace[
ef50: 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d  p->nFree];.    }
ef60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
ef70: 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b  Needed += nByte;
ef80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
ef90: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
efa0: 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20  ALIGNMENT(pBuf) 
efb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66  );.  return pBuf
efc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e  ;.}../*.** Rewin
efd0: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20  d the VDBE back 
efe0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
eff0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
f000: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  for.** running i
f010: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
f020: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62  e3VdbeRewind(Vdb
f030: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
f040: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
f050: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
f060: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
f070: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  i;.#endif.  asse
f080: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
f090: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
f0a0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
f0b0: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
f0c0: 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b  E_MAGIC_RESET );
f0d0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
f0e0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
f0f0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
f100: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
f110: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
f120: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
f130: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
f140: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
f150: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
f160: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
f170: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
f180: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
f190: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=0; i<p->nMem
f1a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
f1b0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
f1c0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
f1d0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
f1e0: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
f1f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
f200: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
f210: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61  Abort;.  p->nCha
f220: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
f230: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
f240: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
f250: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
f260: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
f270: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
f280: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
f290: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f  DBE_PROFILE.  fo
f2a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
f2b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f   i++){.    p->aO
f2c0: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
f2d0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
f2e0: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  es = 0;.  }.#end
f2f0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
f300: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
f310: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
f320: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73  ion for the firs
f330: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20  t time after.** 
f340: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72  creating the vir
f350: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
f360: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
f370: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
f380: 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74  llocating regist
f390: 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ers and initiali
f3a0: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
f3b0: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
f3c0: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
f3d0: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
f3e0: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
f3f0: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
f400: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
f410: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
f420: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
f430: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
f440: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e   exactly once on
f450: 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61   each virtual ma
f460: 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20  chine..** After 
f470: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f480: 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61  called the VM ha
f490: 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64  s been "packaged
f4a0: 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a  " and is ready.*
f4b0: 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72  * to run.  After
f4c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f4d0: 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72   called, further
f4e0: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71   calls to .** sq
f4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29  lite3VdbeAddOp()
f500: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70   functions are p
f510: 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73  rohibited.  This
f520: 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e   routine disconn
f530: 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65  ects.** the Vdbe
f540: 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20   from the Parse 
f550: 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70  object that help
f560: 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73  ed generate it s
f570: 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68  o that the.** th
f580: 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61  e Vdbe becomes a
f590: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e  n independent en
f5a0: 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72  tity and the Par
f5b0: 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65  se object can be
f5c0: 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  .** destroyed..*
f5d0: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
f5e0: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29  ite3VdbeRewind()
f5f0: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65   procedure to re
f600: 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20  store a virtual 
f610: 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20  machine back.** 
f620: 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73  to its initial s
f630: 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61  tate after it ha
f640: 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76  s been run..*/.v
f650: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
f660: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
f670: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
f680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f690: 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73  e VDBE */.  Pars
f6a0: 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20  e *pParse       
f6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f6c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f6d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
f6e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
f6f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
f700: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
f710: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20  */.  int nVar;  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f740: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
f750: 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20   int nMem;      
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20  /* Number of VM 
f780: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
f790: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
f7a0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
f7b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f7c0: 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72  f cursors requir
f7d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ed */.  int nArg
f7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f7f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f800: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e   of arguments in
f810: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
f820: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
f850: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75   */.  struct Reu
f860: 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20  sableSpace x;   
f870: 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65       /* Reusable
f880: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a   bulk memory */.
f890: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
f8a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f8b0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
f8c0: 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
f8d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
f8e0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
f8f0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
f900: 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72   pParse==p->pPar
f910: 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  se );.  db = p->
f920: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
f930: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
f940: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
f950: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
f960: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
f970: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
f980: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
f990: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
f9a0: 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45  axArg;.  .  /* E
f9b0: 61 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20  ach cursor uses 
f9c0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20  a memory cell.  
f9d0: 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  The first cursor
f9e0: 20 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a   (cursor 0) can.
f9f0: 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d    ** use aMem[0]
fa00: 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74   which is not ot
fa10: 68 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20  herwise used by 
fa20: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
fa30: 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  .  Allocate.  **
fa40: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
fa50: 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20  d of aMem[] for 
fa60: 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72  cursors 1 and gr
fa70: 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20  eater..  ** See 
fa80: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
fa90: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
faa0: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
fab0: 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30    if( nCursor==0
fac0: 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65   && nMem>0 ) nMe
fad0: 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66  m++;  /* Space f
fae0: 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20  or aMem[0] even 
faf0: 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a  if not used */..
fb00: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
fb10: 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c  how much reusabl
fb20: 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69  e memory is avai
fb30: 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64  lable at the end
fb40: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63   of the.  ** opc
fb50: 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
fb60: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69   extra memory wi
fb70: 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ll be reallocate
fb80: 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d  d for other elem
fb90: 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
fba0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
fbb0: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  ent..  */.  n = 
fbc0: 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70  ROUND8(sizeof(Op
fbd0: 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20  )*p->nOp);      
fbe0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
fbf0: 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72   of opcode memor
fc00: 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53  y used */.  x.pS
fc10: 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d  pace = &((u8*)p-
fc20: 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20  >aOp)[n];       
fc30: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
fc40: 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  d opcode memory 
fc50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  */.  assert( EIG
fc60: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
fc70: 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20  T(x.pSpace) );. 
fc80: 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44   x.nFree = ROUND
fc90: 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a  DOWN8(pParse->sz
fca0: 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f  OpAlloc - n);  /
fcb0: 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65  * Bytes of unuse
fcc0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  d memory */.  as
fcd0: 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30  sert( x.nFree>=0
fce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
fcf0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
fd00: 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e  NT(&x.pSpace[x.n
fd10: 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73  Free]) );..  res
fd20: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
fd30: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
fd40: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
fd50: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
fd60: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
fd70: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
fd80: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
fd90: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
fda0: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
fdb0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72  ;.  }.  p->expir
fdc0: 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65  ed = 0;..  /* Me
fdd0: 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65  mory for registe
fde0: 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20  rs, parameters, 
fdf0: 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20  cursor, etc, is 
fe00: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65  allocated in one
fe10: 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   or two.  ** pas
fe20: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
fe30: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
fe40: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
fe50: 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20  memory at the . 
fe60: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
fe70: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
fe80: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
fe90: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
fea0: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
feb0: 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e  ements by reusin
fec0: 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  g the opcode arr
fed0: 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68  ay tail, then th
fee0: 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61  e second.  ** pa
fef0: 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20  ss will fill in 
ff00: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73  the remainder us
ff10: 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f  ing a fresh memo
ff20: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ry allocation.  
ff30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
ff40: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
ff50: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
ff60: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
ff70: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
ff80: 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20  ** the leftover 
ff90: 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e  memory at the en
ffa0: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
ffb0: 61 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e  array.  This can
ffc0: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
ffd0: 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61   ** reduce the a
ffe0: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
fff0: 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72  held by a prepar
10000 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
10010 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e  */.  do {.    x.
10020 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20  nNeeded = 0;.   
10030 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
10040 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65  Space(&x, p->aMe
10050 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d  m, nMem*sizeof(M
10060 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  em));.    p->aVa
10070 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
10080 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  x, p->aVar, nVar
10090 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20  *sizeof(Mem));. 
100a0 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c     p->apArg = al
100b0 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
100c0 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
100d0 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70  of(Mem*));.    p
100e0 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
100f0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73  pace(&x, p->apCs
10100 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
10110 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10130 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10140 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45  TATUS.    p->anE
10150 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
10160 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20  (&x, p->anExec, 
10170 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
10180 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  4));.#endif.    
10190 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30  if( x.nNeeded==0
101a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e   ) break;.    x.
101b0 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65  pSpace = p->pFre
101c0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
101d0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e  locRawNN(db, x.n
101e0 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e  Needed);.    x.n
101f0 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64  Free = x.nNeeded
10200 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d  ;.  }while( !db-
10210 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10220 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20  ..  p->pVList = 
10230 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a  pParse->pVList;.
10240 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74    pParse->pVList
10250 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c   =  0;.  p->expl
10260 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
10270 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d  plain;.  if( db-
10280 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10290 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30  .    p->nVar = 0
102a0 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ;.    p->nCursor
102b0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65   = 0;.    p->nMe
102c0 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 0;.  }else{.
102d0 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
102e0 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d   nCursor;.    p-
102f0 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
10300 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d  Var;.    initMem
10310 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e  Array(p->aVar, n
10320 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  Var, db, MEM_Nul
10330 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20  l);.    p->nMem 
10340 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74  = nMem;.    init
10350 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
10360 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f  , nMem, db, MEM_
10370 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20  Undefined);.    
10380 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c  memset(p->apCsr,
10390 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65   0, nCursor*size
103a0 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29  of(VdbeCursor*))
103b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
103c0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
103d0 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65  STATUS.    memse
103e0 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20  t(p->anExec, 0, 
103f0 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
10400 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  4));.#endif.  }.
10410 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77    sqlite3VdbeRew
10420 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ind(p);.}../*.**
10430 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
10440 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
10450 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
10460 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
10470 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
10480 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
10490 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
104a0 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
104b0 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
104c0 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
104d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
104e0 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78  ssert( pCx->pBtx
104f0 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72  ==0 || pCx->eCur
10500 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
10510 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28  REE );.  switch(
10520 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29   pCx->eCurType )
10530 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  {.    case CURTY
10540 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20  PE_SORTER: {.   
10550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
10560 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
10570 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65   pCx);.      bre
10580 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10590 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  se CURTYPE_BTREE
105a0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  : {.      if( pC
105b0 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29  x->isEphemeral )
105c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  {.        if( pC
105d0 78 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65  x->pBtx ) sqlite
105e0 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
105f0 3e 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20  >pBtx);.        
10600 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
10610 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
10620 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
10630 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
10640 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  y.        ** the
10650 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
10660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10670 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78       assert( pCx
10680 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
10690 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
106a0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
106b0 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  or(pCx->uc.pCurs
106c0 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
106d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
106e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
106f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10700 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
10710 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  E_VTAB: {.      
10720 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
10730 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78  sor *pVCur = pCx
10740 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20  ->uc.pVCur;.    
10750 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
10760 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
10770 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e  = pVCur->pVtab->
10780 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61  pModule;.      a
10790 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56  ssert( pVCur->pV
107a0 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  tab->nRef>0 );. 
107b0 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61       pVCur->pVta
107c0 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  b->nRef--;.     
107d0 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
107e0 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62  (pVCur);.      b
107f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
10800 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
10810 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
10820 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
10830 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
10840 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73  c void closeCurs
10850 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20  orsInFrame(Vdbe 
10860 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
10870 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
10880 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
10890 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
108a0 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
108b0 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
108c0 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
108d0 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
108e0 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
108f0 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
10900 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
10910 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
10920 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10930 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
10940 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
10950 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
10960 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
10970 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
10980 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
10990 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
109a0 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
109b0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
109c0 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
109d0 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
109e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
109f0 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
10a00 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
10a10 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
10a20 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43  ame->v;.  closeC
10a30 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29  ursorsInFrame(v)
10a40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
10a50 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
10a60 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
10a70 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
10a80 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
10a90 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
10aa0 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
10ab0 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
10ac0 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
10ad0 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
10ae0 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
10af0 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
10b00 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
10b10 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
10b20 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
10b30 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
10b40 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
10b50 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
10b60 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
10b70 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68  ge;.  v->db->nCh
10b80 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
10b90 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69  DbChange;.  sqli
10ba0 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
10bb0 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e  Data(v->db, &v->
10bc0 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
10bd0 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20  ;.  v->pAuxData 
10be0 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61  = pFrame->pAuxDa
10bf0 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41  ta;.  pFrame->pA
10c00 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65  uxData = 0;.  re
10c10 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
10c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10c30 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
10c40 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
10c50 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
10c60 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
10c70 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
10c80 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
10c90 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
10ca0 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
10cb0 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
10cc0 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
10cd0 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
10ce0 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
10cf0 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
10d00 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
10d10 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
10d20 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
10d30 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
10d40 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
10d50 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
10d60 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
10d70 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
10d80 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
10d90 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
10da0 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
10db0 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
10dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10dd0 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
10de0 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72  ame);.    p->pFr
10df0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ame = 0;.    p->
10e00 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  nFrame = 0;.  }.
10e10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
10e20 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73  ame==0 );.  clos
10e30 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
10e40 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  p);.  if( p->aMe
10e50 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
10e60 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
10e70 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
10e80 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
10e90 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
10ea0 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
10eb0 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
10ec0 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
10ed0 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
10ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
10ef0 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
10f00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
10f10 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c  e any auxdata al
10f20 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
10f30 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66  y the VM */.  if
10f40 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20  ( p->pAuxData ) 
10f50 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
10f60 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20  eAuxData(p->db, 
10f70 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &p->pAuxData, -1
10f80 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
10f90 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  p->pAuxData==0 )
10fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
10fb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
10fc0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
10fd0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
10fe0 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
10ff0 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
11000 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
11010 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
11020 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
11030 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
11040 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
11050 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
11060 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
11070 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
11080 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
11090 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
110a0 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
110b0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
110c0 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
110d0 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
110e0 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  n){.  int n;.  s
110f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
11100 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52  db;..  if( p->nR
11110 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  esColumn ){.    
11120 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
11130 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
11140 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
11150 4d 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74  ME_N);.    sqlit
11160 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
11170 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  aColName);.  }. 
11180 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
11190 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
111a0 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
111b0 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
111c0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d  p->aColName = (M
111d0 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
111e0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
111f0 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
11200 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
11210 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
11220 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  nitMemArray(p->a
11230 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20  ColName, n, db, 
11240 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  MEM_Null);.}../*
11250 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
11260 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
11270 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
11280 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
11290 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
112a0 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
112b0 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
112c0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
112d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
112e0 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
112f0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
11300 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
11310 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
11320 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
11330 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
11340 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
11350 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
11360 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
11370 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
11380 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
11390 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
113a0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
113b0 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
113c0 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
113d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
113e0 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
113f0 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
11400 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
11410 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
11420 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
11440 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
11450 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
11460 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
11470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11480 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
11490 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
114a0 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
114d0 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
114e0 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
114f0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11510 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
11520 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
11530 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
11540 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
11550 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
11560 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
11570 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
11580 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
11590 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
115a0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
115b0 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
115c0 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
115d0 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
115e0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
115f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
11600 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
11610 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
11620 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
11630 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
11640 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
11650 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
11660 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
11670 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
11680 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
11690 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
116a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
116b0 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
116c0 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
116d0 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
116e0 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
116f0 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
11700 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
11710 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
11720 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11730 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
11740 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
11750 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
11760 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
11770 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
11780 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
11790 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
117a0 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
117b0 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
117c0 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
117d0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
117e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
117f0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
11800 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
11810 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11820 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
11830 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
11840 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
11850 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
11860 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
11870 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
11880 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
11890 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
118a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te-transaction. 
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61    ** that are ca
118d0 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74  ndidates for a t
118e0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20  wo-phase commit 
118f0 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20  using a.        
11900 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61             ** ma
11910 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster-journal */.
11920 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11930 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
11940 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
11950 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
11960 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11970 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
11980 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
11990 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
119a0 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
119b0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
119c0 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
119d0 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
119e0 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
119f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
11a00 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
11a10 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
11a20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
11a30 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
11a40 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
11a50 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
11a60 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
11a70 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
11a80 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
11a90 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
11aa0 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
11ab0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
11ac0 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
11ad0 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
11ae0 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
11af0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
11b00 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
11b10 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
11b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
11b30 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a  abSync(db, p);..
11b40 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
11b50 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
11b60 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
11b70 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
11b80 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
11b90 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
11ba0 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
11bb0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
11bc0 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
11bd0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
11be0 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
11bf0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
11c00 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
11c10 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
11c20 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
11c30 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
11c40 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
11c50 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
11c60 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
11c70 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
11c80 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
11c90 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
11ca0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
11cb0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
11cc0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11cd0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11ce0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
11cf0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
11d00 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  {.      /* Wheth
11d10 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61  er or not a data
11d20 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20  base might need 
11d30 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11d40 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20   depends upon.  
11d50 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e      ** its journ
11d60 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f  al mode (among o
11d70 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54  ther things).  T
11d80 68 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72  his matrix deter
11d90 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20  mines which.    
11da0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64    ** journal mod
11db0 65 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20  es use a master 
11dc0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63  journal and whic
11dd0 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20  h do not */.    
11de0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
11df0 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20  8 aMJNeeded[] = 
11e00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c  {.        /* DEL
11e10 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20  ETE   */  1,.   
11e20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20       /* PERSIST 
11e30 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20    */ 1,.        
11e40 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20  /* OFF       */ 
11e50 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52  0,.        /* TR
11e60 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20  UNCATE  */ 1,.  
11e70 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20        /* MEMORY 
11e80 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20     */ 0,.       
11e90 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f   /* WAL       */
11ea0 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
11eb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
11ec0 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f     /* Pager asso
11ed0 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20  ciated with pBt 
11ee0 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  */.      needXco
11ef0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
11f00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11f10 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50  r(pBt);.      pP
11f20 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
11f30 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20  reePager(pBt);. 
11f40 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62       if( db->aDb
11f50 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [i].safety_level
11f60 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  !=PAGER_SYNCHRON
11f70 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26  OUS_OFF.       &
11f80 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69  & aMJNeeded[sqli
11f90 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e  te3PagerGetJourn
11fa0 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a  alMode(pPager)].
11fb0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
11fc0 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50  3PagerIsMemdb(pP
11fd0 61 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29  ager)==0.      )
11fe0 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  { .        asser
11ff0 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20  t( i!=1 );.     
12000 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20     nTrans++;.   
12010 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
12020 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
12030 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
12040 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12050 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
12060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12070 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12080 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
120a0 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
120b0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
120c0 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
120d0 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
120e0 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
120f0 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
12100 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
12110 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
12120 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
12130 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
12140 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
12150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
12160 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
12170 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
12180 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
12190 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
121a0 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
121b0 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
121c0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
121d0 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
121e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
121f0 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
12200 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
12210 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
12220 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
12230 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
12240 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
12250 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
12260 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
12270 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
12280 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
12290 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
122a0 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
122b0 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
122c0 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
122d0 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
122e0 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
122f0 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
12300 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
12310 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
12320 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
12330 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
12340 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
12350 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
12360 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
12370 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
12380 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
12390 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
123a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
123b0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
123c0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
123d0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
123e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
123f0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12400 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
12410 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
12420 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
12430 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
12440 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
12450 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
12460 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
12470 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
12480 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
12490 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
124a0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
124b0 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
124c0 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
124d0 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
124e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
124f0 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
12500 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
12510 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
12520 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
12530 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
12540 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
12550 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
12560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12570 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
12580 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
12590 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
125a0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
125b0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
125c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
125d0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
125e0 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
125f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
12600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12610 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
12620 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
12630 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
12640 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
12650 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
12660 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
12670 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
12680 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
12690 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
126a0 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
126b0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
126c0 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
126d0 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ted atomically..
126e0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
126f0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
12700 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
12710 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
12720 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68  db->pVfs;.    ch
12730 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
12740 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
12750 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
12760 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
12770 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
12780 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
12790 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
127a0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
127b0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
127c0 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
127d0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
127e0 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
127f0 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
12800 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
12810 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
12820 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
12830 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
12840 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
12850 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
12860 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
12870 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
12880 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
12890 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
128a0 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
128b0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
128c0 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
128d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
128e0 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
128f0 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
12900 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
12910 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
12920 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
12930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12940 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
12950 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
12960 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
12970 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12980 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
12990 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
129a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
129b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
129c0 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
129d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
129e0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
129f0 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
12a00 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
12a10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12a20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
12a30 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
12a40 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
12a50 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
12a60 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
12a70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12a80 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
12a90 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
12aa0 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
12ad0 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
12ae0 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
12af0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
12b00 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
12b10 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
12b20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
12b30 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
12b40 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
12b50 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
12b60 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
12b70 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
12b80 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
12b90 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
12ba0 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
12bb0 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
12bc0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
12bd0 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
12be0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
12bf0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
12c00 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
12c10 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
12c20 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
12c30 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
12c40 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
12c50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12c70 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
12c80 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
12c90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12ca0 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
12cb0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
12cc0 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
12cd0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
12ce0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
12cf0 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
12d00 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
12d10 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
12d20 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
12d30 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
12d40 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
12d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12d60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12d70 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
12d80 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
12d90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
12da0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
12db0 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
12dc0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
12dd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
12de0 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
12df0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12e00 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
12e10 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
12e20 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
12e30 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
12e40 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12e50 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
12e60 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
12e70 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
12e80 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
12e90 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
12ea0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
12eb0 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
12ec0 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
12ed0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
12ee0 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
12ef0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
12f00 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12f10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
12f20 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12f30 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12f40 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
12f50 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
12f60 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
12f70 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
12f80 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
12f90 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
12fa0 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
12fb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12fc0 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
12fd0 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
12fe0 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
12ff0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
13000 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
13010 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
13020 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13030 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
13040 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
13050 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
13060 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
13070 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
13080 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13090 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
130a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
130b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
130c0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
130d0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
130e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
130f0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
13100 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
13110 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13120 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
13130 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13140 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
13150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
13160 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
13170 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13180 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
13190 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
131a0 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
131b0 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
131c0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
131d0 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71  /.    if( 0==(sq
131e0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
131f0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
13200 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
13210 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
13220 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
13230 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
13240 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
13250 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
13260 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
13270 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
13280 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
13290 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
132a0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
132b0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
132c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
132d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
132e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
132f0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
13300 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
13310 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
13320 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
13330 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
13340 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
13350 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
13360 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
13370 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
13380 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
13390 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
133a0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
133b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
133c0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
133d0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
133e0 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
133f0 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
13400 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
13410 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
13420 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
13430 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
13440 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
13450 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
13460 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
13470 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
13480 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
13490 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
134a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
134b0 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
134c0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
134d0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
134e0 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
134f0 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
13500 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
13510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13520 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
13530 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
13540 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
13550 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
13560 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
13570 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
13580 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
13590 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
135a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
135b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
135c0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
135d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
135e0 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
135f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13600 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13610 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
13620 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
13630 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
13640 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
13650 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13660 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
13670 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
13680 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
13690 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
136a0 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
136b0 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
136c0 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
136d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
136e0 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
136f0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
13700 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
13710 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
13720 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
13730 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
13740 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
13750 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
13760 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
13770 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
13780 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
13790 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
137a0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
137b0 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
137c0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
137d0 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
137e0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
137f0 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
13800 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
13810 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
13820 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
13830 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
13840 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
13850 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
13860 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
13870 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
13880 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
13890 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
138a0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
138b0 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
138c0 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
138d0 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
138e0 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
138f0 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
13900 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
13910 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
13920 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
13930 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
13940 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
13950 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
13960 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
13970 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
13980 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
13990 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
139a0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
139b0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
139c0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
139d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
139e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
139f0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
13a00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13a10 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
13a20 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
13a30 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
13a40 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
13a50 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
13a60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
13a70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
13a80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13a90 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
13aa0 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
13ab0 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
13ac0 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
13ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
13ae0 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
13af0 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
13b00 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
13b10 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
13b20 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
13b30 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
13b40 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
13b50 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
13b60 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
13b70 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
13b80 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
13b90 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
13ba0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
13bb0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
13bc0 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
13bd0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
13be0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
13bf0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
13c00 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
13c10 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
13c20 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
13c30 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
13c40 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
13c50 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
13c60 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
13c70 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
13c80 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
13c90 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
13ca0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
13cb0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
13cc0 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
13cd0 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
13ce0 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
13cf0 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
13d00 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
13d10 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
13d20 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
13d30 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
13d40 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
13d50 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
13d60 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
13d70 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
13d80 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
13d90 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
13da0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
13db0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
13dc0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
13dd0 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
13de0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
13df0 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
13e00 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
13e10 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
13e20 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
13e30 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
13e40 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
13e50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
13e60 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
13e70 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
13e80 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
13e90 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
13ea0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
13eb0 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
13ec0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
13ed0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
13ee0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
13ef0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
13f00 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
13f10 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
13f20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
13f30 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
13f40 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
13f50 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
13f60 69 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61  int vdbeCloseSta
13f70 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
13f80 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
13f90 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
13fa0 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
13fb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13fc0 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  nt i;.  const in
13fd0 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
13fe0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
13ff0 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d  .  assert( eOp==
14000 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14010 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
14020 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
14030 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
14040 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
14050 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
14060 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
14070 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
14080 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28  oint) );..  for(
14090 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
140a0 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72  i++){ .    int r
140b0 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
140c0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
140d0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
140e0 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a  .    if( pBt ){.
140f0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
14100 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14110 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32  K ){.        rc2
14120 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
14130 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
14140 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14150 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
14160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14170 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
14180 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
14190 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
141a0 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
141b0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
141c0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
141d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
141e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
141f0 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
14200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14210 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d   }.  db->nStatem
14220 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61  ent--;.  p->iSta
14230 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69  tement = 0;..  i
14240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14250 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   ){.    if( eOp=
14260 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
14270 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
14280 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
14290 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
142a0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
142b0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
142c0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
142d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
142e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
142f0 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
14300 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14310 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
14320 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14330 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
14340 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
14350 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
14360 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
14370 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
14380 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
14390 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
143a0 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
143b0 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
143c0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
143d0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
143e0 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
143f0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
14400 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
14410 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
14420 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
14430 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d  DefCons;.    db-
14440 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
14450 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
14460 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65  mmCons;.  }.  re
14470 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
14480 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
14490 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
144a0 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66  , int eOp){.  if
144b0 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d  ( p->db->nStatem
144c0 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
144d0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75  ment ){.    retu
144e0 72 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  rn vdbeCloseStat
144f0 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20  ement(p, eOp);. 
14500 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14510 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
14520 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14530 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
14540 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
14550 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
14560 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
14570 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
14580 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
14590 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
145a0 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
145b0 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
145c0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
145d0 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
145e0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
145f0 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
14600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14610 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
14620 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
14630 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
14640 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
14650 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
14660 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
14670 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
14680 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
14690 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
146a0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
146b0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
146c0 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
146d0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
146e0 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
146f0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
14700 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14710 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
14720 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
14730 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
14740 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
14750 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14760 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
14770 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
14780 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
14790 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
147a0 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
147b0 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
147c0 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
147d0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
147e0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
147f0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
14800 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
14810 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
14820 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
14830 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45  r(p, "FOREIGN KE
14840 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
14850 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
14860 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14870 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
14880 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
14890 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
148a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
148b0 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
148c0 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
148d0 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
148e0 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
148f0 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
14900 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
14910 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
14920 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
14930 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
14940 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
14950 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
14960 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
14970 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
14980 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
14990 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
149a0 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
149b0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
149c0 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
149d0 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
149e0 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
149f0 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
14a00 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
14a10 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
14a20 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
14a30 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
14a40 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
14a50 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
14a60 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
14a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
14a80 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
14a90 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
14aa0 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
14ab0 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
14ac0 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
14ad0 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
14ae0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
14af0 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
14b00 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
14b30 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
14b40 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
14b50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14b60 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
14b70 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
14b80 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
14b90 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
14ba0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
14bb0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
14bc0 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
14bd0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
14be0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
14bf0 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
14c00 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
14c10 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
14c20 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
14c30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
14c40 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
14c50 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
14c60 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
14c70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
14c80 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
14c90 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
14ca0 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
14cb0 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
14cc0 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
14cd0 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
14ce0 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
14cf0 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
14d00 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
14d10 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
14d20 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14d30 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
14d40 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
14d50 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
14d60 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
14d70 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
14d80 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
14d90 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
14da0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
14db0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14dc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
14dd0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
14de0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
14df0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
14e00 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  BKPT;.  }.  clos
14e10 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
14e20 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
14e30 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
14e40 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
14e50 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
14e60 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
14e70 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
14e80 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
14e90 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
14ea0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
14eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14ec0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
14ed0 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
14ee0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
14ef0 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
14f00 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
14f10 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
14f20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
14f30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
14f40 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
14f50 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
14f60 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
14f70 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
14f80 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
14f90 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
14fa0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
14fb0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
14fc0 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
14fd0 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
14fe0 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
14ff0 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
15000 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
15010 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
15020 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
15030 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
15040 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
15060 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
15070 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
15080 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
15090 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
150a0 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
150b0 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
150c0 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
150d0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
150e0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
150f0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
15100 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
15110 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
15120 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
15130 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
15140 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
15150 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
15160 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
15170 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
15180 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
15190 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
151a0 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
151b0 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
151c0 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
151d0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
151e0 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
151f0 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
15200 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
15210 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
15220 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
15230 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
15240 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
15250 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
15260 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
15270 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
15280 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
15290 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
152a0 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
152b0 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
152c0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
152d0 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
152e0 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
152f0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
15300 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
15310 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
15320 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
15330 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
15340 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
15350 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
15360 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
15370 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
15380 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
15390 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
153a0 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
153b0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
153c0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
153d0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
153e0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
153f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15400 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
15410 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
15420 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
15430 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
15440 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
15450 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
15460 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
15470 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
15480 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
15490 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
154a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
154b0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
154c0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
154d0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
154e0 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
154f0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
15500 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
15510 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
15520 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
15530 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
15540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
15550 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
15560 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
15570 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
15580 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
15590 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
155a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
155b0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
155c0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
155d0 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
155e0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
155f0 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
15600 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
15610 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
15620 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
15630 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
15640 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
15650 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
15660 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
15670 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
15680 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
15690 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
156a0 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
156b0 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
156c0 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
156d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
156e0 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
156f0 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
15700 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
15710 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
15720 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
15730 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
15740 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
15750 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
15760 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
15770 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
15780 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
15790 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
157a0 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
157b0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
157c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
157d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
157e0 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
157f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
15800 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
15810 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
15820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15830 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
15840 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
15850 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
15860 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
15870 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
15880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15890 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
158a0 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
158b0 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
158c0 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
158d0 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
158e0 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
158f0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
15900 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
15910 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
15920 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
15930 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
15940 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
15950 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
15960 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
15970 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
15980 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
15990 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
159a0 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
159b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
159c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
159d0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
159e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
159f0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
15a00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15a10 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
15a20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
15a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15a40 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
15a50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
15a60 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
15a70 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
15a80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
15a90 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
15aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ab0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
15ac0 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
15ad0 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
15ae0 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
15af0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
15b00 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
15b10 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20  eferFKs;.       
15b20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
15b30 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
15b40 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
15b50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15b60 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
15b70 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
15b80 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  E_OK);.        p
15b90 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
15ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
15bb0 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
15bc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
15bd0 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
15be0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
15bf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
15c00 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
15c10 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
15c20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
15c30 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
15c40 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
15c50 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
15c60 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
15c70 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
15c80 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
15c90 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
15ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15cb0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
15cc0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
15cd0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
15ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
15cf0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
15d00 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
15d10 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
15d20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
15d30 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
15d40 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
15d50 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
15d60 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
15d70 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
15d80 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
15d90 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
15da0 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
15db0 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
15dc0 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
15dd0 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
15de0 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
15df0 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
15e00 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
15e10 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
15e20 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
15e30 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
15e40 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
15e50 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
15e60 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
15e70 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
15e80 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
15e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15ea0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
15eb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15ec0 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
15ed0 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
15ee0 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
15ef0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
15f00 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
15f10 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
15f20 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
15f30 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
15f40 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
15f50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15f60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
15f70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
15f80 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
15f90 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
15fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
15fb0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
15fc0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
15fd0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
15fe0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
15ff0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
16000 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
16010 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
16020 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
16030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
16040 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
16050 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
16060 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
16070 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
16080 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
16090 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
160a0 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
160b0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
160c0 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
160d0 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
160e0 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
160f0 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
16100 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
16110 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
16120 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
16130 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
16140 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
16150 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
16160 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16170 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
16180 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
16190 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
161a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
161b0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
161c0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
161d0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
161e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
161f0 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
16200 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
16210 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
16220 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
16230 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
16240 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
16250 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
16260 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
16270 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
16280 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
16290 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
162a0 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
162b0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
162c0 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
162d0 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
162e0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
162f0 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
16300 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
16310 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
16320 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
16330 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
16340 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
16350 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
16360 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
16370 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
16380 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
16390 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
163a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
163b0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
163c0 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
163d0 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
163e0 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
163f0 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
16400 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
16410 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
16420 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
16430 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
16440 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
16450 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
16460 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
16470 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
16480 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
16490 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
164a0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
164b0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
164c0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
164d0 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
164e0 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
164f0 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
16500 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
16510 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
16520 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
16530 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
16540 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
16550 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
16560 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
16570 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
16580 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
16590 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
165a0 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
165b0 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
165c0 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
165d0 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
165e0 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
165f0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16600 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
16610 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
16620 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
16630 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
16640 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
16650 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
16660 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
16670 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
16680 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
16690 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
166a0 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
166b0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
166c0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
166d0 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
166e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
166f0 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
16700 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
16710 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
16720 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
16730 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16740 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
16750 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
16760 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
16770 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
16780 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
16790 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
167a0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
167b0 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61     db->bBenignMa
167c0 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  lloc++;.    sqli
167d0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
167e0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
167f0 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
16800 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
16810 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
16820 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
16830 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
16840 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
16850 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
16860 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
16870 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
16880 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
16890 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c   db->bBenignMall
168a0 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oc--;.  }else if
168b0 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20  ( db->pErr ){.  
168c0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
168d0 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b  tNull(db->pErr);
168e0 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f  .  }.  db->errCo
168f0 64 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  de = rc;.  retur
16900 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
16910 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
16920 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
16930 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
16940 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
16950 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
16960 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
16970 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
16980 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16990 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
169a0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
169b0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
169c0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
169d0 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
169e0 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
169f0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
16a00 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
16a10 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
16a20 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
16a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
16a40 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
16a50 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
16a60 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
16a70 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16a80 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
16a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
16aa0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
16ab0 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
16ac0 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
16ad0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
16ae0 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
16af0 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
16b00 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
16b10 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
16b20 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
16b30 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
16b40 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
16b50 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
16b60 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
16b70 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
16b80 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
16b90 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
16ba0 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
16bb0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
16bc0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
16bd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
16be0 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
16bf0 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
16c00 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
16c10 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
16c20 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
16c30 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
16c40 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
16c50 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
16c60 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
16c70 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
16c80 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
16c90 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
16ca0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
16cb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16cc0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
16cd0 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
16ce0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
16cf0 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
16d00 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
16d10 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
16d20 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
16d30 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
16d40 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
16d50 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
16d60 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
16d70 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
16d80 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
16d90 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
16da0 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
16db0 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
16dc0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
16dd0 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
16de0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
16df0 42 45 20 68 61 73 20 62 65 65 6e 20 72 75 6e 20  BE has been run 
16e00 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
16e10 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
16e20 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
16e30 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
16e40 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
16e50 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
16e60 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
16e70 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
16e80 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
16e90 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
16ea0 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
16eb0 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
16ec0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
16ed0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
16ee0 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
16ef0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
16f00 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
16f10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
16f20 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65  c>=0 ){.    vdbe
16f30 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b  InvokeSqllog(p);
16f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16f50 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
16f60 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e  ;.    if( p->run
16f70 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78  OnlyOnce ) p->ex
16f80 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  pired = 1;.  }el
16f90 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
16fa0 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
16fb0 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
16fc0 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
16fd0 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
16fe0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
16ff0 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
17000 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
17010 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
17020 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
17030 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
17040 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
17050 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
17060 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
17070 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
17080 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
17090 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45  db, p->rc, p->zE
170a0 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
170b0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
170c0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 72   }..  /* Reset r
170d0 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 73  egister contents
170e0 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65 72 72   and reclaim err
170f0 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72  or message memor
17100 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  y..  */.#ifdef S
17110 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
17120 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
17130 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
17140 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
17150 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
17160 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
17170 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
17180 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
17190 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 66  ned up.  */.  if
171a0 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72  ( p->apCsr ) for
171b0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
171c0 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  or; i++) assert(
171d0 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20   p->apCsr[i]==0 
171e0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
171f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
17200 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
17210 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
17220 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55  [i].flags==MEM_U
17230 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a  ndefined );.  }.
17240 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
17250 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
17260 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
17270 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
17280 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 23  ResultSet = 0;.#
17290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
172a0 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74 65 20 3d  UG.  p->nWrite =
172b0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   0;.#endif..  /*
172c0 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
172d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
172e0 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
172f0 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
17300 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
17310 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
17320 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
17330 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
17340 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
17350 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
17360 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
17370 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
17380 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17390 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
173a0 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
173b0 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
173c0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
173d0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
173e0 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
173f0 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70         char c, p
17400 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  c = 0;.        f
17410 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
17420 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
17430 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71  i=0; (c = p->zSq
17440 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  l[i])!=0; i++){.
17450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
17460 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  =='\n' ) fprintf
17470 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
17480 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20          putc(c, 
17490 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
174a0 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  pc = c;.        
174b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  }.        if( pc
174c0 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  !='\n' ) fprintf
174d0 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
174e0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
174f0 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
17500 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
17510 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20   zHdr[100];.    
17520 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
17530 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72  intf(sizeof(zHdr
17540 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31  ), zHdr, "%6u %1
17550 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20  2llu %8llu ",.  
17560 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
17570 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
17580 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
17590 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
175a0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
175b0 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
175c0 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
175d0 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
175e0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
175f0 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29  out, "%s", zHdr)
17600 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17610 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
17620 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
17630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17640 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
17650 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
17660 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
17670 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72  MAGIC_RESET;.  r
17680 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
17690 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
176a0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
176b0 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
176c0 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
176d0 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
176e0 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
176f0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
17700 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
17710 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
17720 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
17730 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
17740 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
17750 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
17760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
17770 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
17780 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
17790 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
177a0 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
177b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
177c0 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
177d0 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
177e0 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
177f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
17800 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
17810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17820 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
17830 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
17840 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
17850 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
17860 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
17870 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
17880 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
17890 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
178a0 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
178b0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
178c0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
178d0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
178e0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
178f0 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
17900 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
17910 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
17920 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
17930 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
17940 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
17950 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
17960 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
17970 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
17980 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
17990 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
179a0 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
179b0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
179c0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
179d0 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
179e0 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
179f0 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
17a00 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
17a10 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
17a20 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
17a30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
17a40 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
17a50 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
17a60 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
17a70 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
17a80 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f  rameter correspo
17a90 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63  nds to bit 0 etc
17aa0 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .)..*/.void sqli
17ab0 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
17ac0 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62  Data(sqlite3 *db
17ad0 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20  , AuxData **pp, 
17ae0 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73  int iOp, int mas
17af0 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  k){.  while( *pp
17b00 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20   ){.    AuxData 
17b10 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20  *pAux = *pp;.   
17b20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20   if( (iOp<0).   
17b30 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75 78    || (pAux->iAux
17b40 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20 20  Op==iOp.        
17b50 20 20 26 26 20 70 41 75 78 2d 3e 69 41 75 78 41    && pAux->iAuxA
17b60 72 67 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 20  rg>=0.          
17b70 26 26 20 28 70 41 75 78 2d 3e 69 41 75 78 41 72  && (pAux->iAuxAr
17b80 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26  g>31 || !(mask &
17b90 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d   MASKBIT32(pAux-
17ba0 3e 69 41 75 78 41 72 67 29 29 29 29 0a 20 20 20  >iAuxArg)))).   
17bb0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
17bc0 73 65 28 20 70 41 75 78 2d 3e 69 41 75 78 41 72  se( pAux->iAuxAr
17bd0 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69  g==31 );.      i
17be0 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
17bf0 41 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Aux ){.        p
17c00 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 28  Aux->xDeleteAux(
17c10 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
17c20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
17c30 20 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b   pAux->pNextAux;
17c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
17c50 46 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a  Free(db, pAux);.
17c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17c70 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78   pp= &pAux->pNex
17c80 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tAux;.    }.  }.
17c90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
17ca0 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
17cb0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
17cc0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
17cd0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
17ce0 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
17cf0 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
17d00 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
17d10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
17d20 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
17d30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
17d40 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
17d50 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
17d60 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
17d70 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
17d80 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
17d90 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
17da0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
17db0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17dc0 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
17dd0 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
17de0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
17df0 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
17e00 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
17e10 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
17e20 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
17e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
17e40 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64  b==0 || p->db==d
17e50 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  b );.  releaseMe
17e60 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
17e70 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
17e80 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
17e90 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f  for(pSub=p->pPro
17ea0 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62  gram; pSub; pSub
17eb0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
17ec0 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74  xt = pSub->pNext
17ed0 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70  ;.    vdbeFreeOp
17ee0 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e  Array(db, pSub->
17ef0 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b  aOp, pSub->nOp);
17f00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
17f10 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20  ee(db, pSub);.  
17f20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  }.  if( p->magic
17f30 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  !=VDBE_MAGIC_INI
17f40 54 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  T ){.    release
17f50 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
17f60 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20  , p->nVar);.    
17f70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
17f80 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20  , p->pVList);.  
17f90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17fa0 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20  db, p->pFree);. 
17fb0 20 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41   }.  vdbeFreeOpA
17fc0 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
17fd0 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
17fe0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
17ff0 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
18000 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18010 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66  p->zSql);.#ifdef
18020 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18030 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
18040 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
18050 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
18060 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  nScan; i++){.   
18070 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18080 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
18090 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
180a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
180b0 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a  (db, p->aScan);.
180c0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
180d0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
180e0 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
180f0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
18100 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
18110 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
18120 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
18130 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
18140 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18150 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
18160 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
18170 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
18180 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28  ct(db, p);.  if(
18190 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
181a0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
181b0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
181c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
181d0 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
181e0 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
181f0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
18200 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
18210 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
18220 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
18230 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
18240 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
18250 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b  AD;.  p->db = 0;
18260 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
18270 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
18280 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
18290 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
182a0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
182b0 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
182c0 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
182d0 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
182e0 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
182f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
18300 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
18310 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
18320 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
18330 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
18340 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
18350 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
18360 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
18370 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
18380 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
18390 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
183a0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
183b0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
183c0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
183d0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
183e0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
183f0 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
18400 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
18410 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  E );.  rc = sqli
18420 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
18430 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75  packed(p->uc.pCu
18440 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
18450 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
18460 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
18470 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
18480 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
18490 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
184a0 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  KPT;.#ifdef SQLI
184b0 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
184c0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
184d0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
184e0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
184f0 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
18500 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
18510 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18520 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
18530 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
18540 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
18550 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
18560 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
18570 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
18580 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
18590 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
185a0 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
185b0 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
185c0 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
185d0 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
185e0 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
185f0 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
18600 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
18610 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66  be pointing.  If
18620 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c   the row was del
18630 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
18640 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  der the.** curso
18650 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  r, set the curso
18660 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  r to point to a 
18670 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  NULL row..*/.sta
18680 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
18690 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f  OINLINE handleMo
186a0 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75  vedCursor(VdbeCu
186b0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
186c0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20  isDifferentRow, 
186d0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rc;.  assert( p-
186e0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
186f0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
18700 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75 72  sert( p->uc.pCur
18710 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
18720 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
18730 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
18740 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b  ->uc.pCursor) );
18750 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
18760 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
18770 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  e(p->uc.pCursor,
18780 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77   &isDifferentRow
18790 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  );.  p->cacheSta
187a0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
187b0 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65  E;.  if( isDiffe
187c0 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c  rentRow ) p->nul
187d0 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75  lRow = 1;.  retu
187e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
187f0 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20  Check to ensure 
18800 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
18810 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f  is valid.  Resto
18820 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  re the cursor.**
18830 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65   if need be.  Re
18840 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72  turn any I/O err
18850 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74  or from the rest
18860 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ore operation..*
18870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18880 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56  eCursorRestore(V
18890 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
188a0 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
188b0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
188c0 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  REE );.  if( sql
188d0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
188e0 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
188f0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
18900 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
18910 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
18920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18930 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
18940 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
18950 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
18960 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
18970 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
18980 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
18990 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
189a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
189b0 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
189c0 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
189d0 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
189e0 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
189f0 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
18a00 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
18a10 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
18a20 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
18a30 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
18a40 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
18a50 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
18a60 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
18a70 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
18a80 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
18a90 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
18aa0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
18ab0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
18ac0 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
18ad0 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
18ae0 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
18af0 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
18b00 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
18b10 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
18b20 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
18b30 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
18b40 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
18b50 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
18b60 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
18b70 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
18b80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
18b90 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
18ba0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
18bb0 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74  Cursor **pp, int
18bc0 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65   *piCol){.  Vdbe
18bd0 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b  Cursor *p = *pp;
18be0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
18bf0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
18c00 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43 75 72  BTREE || p->eCur
18c10 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53  Type==CURTYPE_PS
18c20 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20 70 2d  EUDO );.  if( p-
18c30 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
18c40 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61 70 3b  ){.    int iMap;
18c50 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74  .    if( p->aAlt
18c60 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70  Map && (iMap = p
18c70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43  ->aAltMap[1+*piC
18c80 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  ol])>0 ){.      
18c90 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72  *pp = p->pAltCur
18ca0 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f  sor;.      *piCo
18cb0 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20  l = iMap - 1;.  
18cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18cd0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18ce0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
18cf0 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
18d00 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
18d10 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
18d20 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
18d30 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
18d40 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
18d50 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
18d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18d70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
18d80 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
18d90 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
18da0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
18db0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
18dc0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
18dd0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18de0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
18df0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
18e00 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
18e10 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
18e20 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
18e30 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
18e40 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
18e50 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
18e60 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
18e70 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
18e80 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
18e90 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
18ea0 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
18eb0 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
18ec0 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
18ed0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
18ee0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
18ef0 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
18f00 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
18f10 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
18f20 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
18f30 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
18f40 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
18f50 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
18f60 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
18f70 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
18f80 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
18f90 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
18fa0 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
18fb0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
18fc0 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
18fd0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
18fe0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
18ff0 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
19000 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
19010 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
19020 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
19030 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
19040 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
19050 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
19060 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
19070 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
19080 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
19090 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
190a0 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
190b0 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
190c0 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
190d0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
190e0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
190f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
19100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
19110 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
19120 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
19130 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
19140 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
19150 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
19160 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19170 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
19180 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
19190 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
191a0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
191b0 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
191e0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
191f0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
19200 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
19210 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
19220 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19240 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
19250 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
19260 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
19280 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
19290 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
192a0 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
192b0 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
192c0 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
192d0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
192f0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
19300 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
19310 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
19320 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
19330 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
19340 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
19350 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
19380 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
19390 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
193a0 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
193b0 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
193c0 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
193d0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
193e0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
193f0 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
19400 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
19410 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
19420 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
19430 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
19440 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
19450 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
19460 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
19470 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
19480 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
19490 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
194a0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
194b0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
194c0 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
194d0 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
194e0 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e  ormat, u32 *pLen
194f0 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
19500 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
19510 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  u32 n;..  assert
19520 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69  ( pLen!=0 );.  i
19530 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
19540 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
19550 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
19560 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
19570 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
19580 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
19590 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
195a0 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
195b0 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
195c0 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
195d0 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
195e0 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
195f0 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
19600 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
19610 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
19620 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
19630 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
19640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
19650 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66  =127 ){.      if
19660 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69  ( (i&1)==i && fi
19670 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
19680 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
19690 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
196a0 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20  n 8+(u32)u;.    
196b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
196c0 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20   *pLen = 1;.    
196d0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
196e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
196f0 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20  if( u<=32767 ){ 
19700 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72  *pLen = 2; retur
19710 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 2; }.    if( u
19720 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c  <=8388607 ){ *pL
19730 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33  en = 3; return 3
19740 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32  ; }.    if( u<=2
19750 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c  147483647 ){ *pL
19760 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34  en = 4; return 4
19770 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d  ; }.    if( u<=M
19780 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65  AX_6BYTE ){ *pLe
19790 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b  n = 6; return 5;
197a0 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38   }.    *pLen = 8
197b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
197c0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
197d0 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
197e0 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
197f0 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
19800 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
19810 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
19820 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
19830 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
19840 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
19850 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
19860 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
19870 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
19880 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
19890 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
198a0 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65   *pLen = n;.  re
198b0 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
198c0 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
198d0 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
198e0 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
198f0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
19900 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73  ss than 128.*/.s
19910 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73  tatic const u8 s
19920 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
19930 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  izes[] = {.     
19940 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32     /*  0   1   2
19950 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36     3   4   5   6
19960 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20     7   8   9 */ 
19970 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30    ./*   0 */   0
19980 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
19990 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30  ,  6,  8,  8,  0
199a0 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20  ,  0,./*  10 */ 
199b0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
199c0 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c    1,  1,  2,  2,
199d0 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20    3,  3,./*  20 
199e0 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20  */   4,  4,  5, 
199f0 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20   5,  6,  6,  7, 
19a00 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20   7,  8,  8,./*  
19a10 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31  30 */   9,  9, 1
19a20 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31  0, 10, 11, 11, 1
19a30 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f  2, 12, 13, 13,./
19a40 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34  *  40 */  14, 14
19a50 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36  , 15, 15, 16, 16
19a60 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38  , 17, 17, 18, 18
19a70 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c  ,./*  50 */  19,
19a80 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c   19, 20, 20, 21,
19a90 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c   21, 22, 22, 23,
19aa0 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20   23,./*  60 */  
19ab0 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20  24, 24, 25, 25, 
19ac0 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20  26, 26, 27, 27, 
19ad0 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a  28, 28,./*  70 *
19ae0 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33  /  29, 29, 30, 3
19af0 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33  0, 31, 31, 32, 3
19b00 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38  2, 33, 33,./*  8
19b10 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35  0 */  34, 34, 35
19b20 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37  , 35, 36, 36, 37
19b30 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a  , 37, 38, 38,./*
19b40 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c    90 */  39, 39,
19b50 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c   40, 40, 41, 41,
19b60 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c   42, 42, 43, 43,
19b70 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20  ./* 100 */  44, 
19b80 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20  44, 45, 45, 46, 
19b90 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20  46, 47, 47, 48, 
19ba0 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34  48,./* 110 */  4
19bb0 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35  9, 49, 50, 50, 5
19bc0 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35  1, 51, 52, 52, 5
19bd0 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f  3, 53,./* 120 */
19be0 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35    54, 54, 55, 55
19bf0 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37  , 56, 56, 57, 57
19c00 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .};../*.** Retur
19c10 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
19c20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
19c30 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
19c40 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
19c50 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
19c60 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
19c70 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
19c80 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
19c90 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a  al_type>=128 ){.
19ca0 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
19cb0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
19cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
19cd0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
19ce0 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  12 .            
19cf0 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  || sqlite3SmallT
19d00 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
19d10 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74  type]==(serial_t
19d20 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20  ype - 12)/2 );. 
19d30 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
19d40 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
19d50 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
19d60 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64  }.}.u8 sqlite3Vd
19d70 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
19d80 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c  ypeLen(u8 serial
19d90 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
19da0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
19db0 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  8 );.  return sq
19dc0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
19dd0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
19de0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ;  .}../*.** If 
19df0 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
19e00 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
19e10 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
19e20 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
19e30 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
19e40 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
19e50 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
19e60 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
19e70 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
19e80 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
19e90 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
19ea0 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
19eb0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
19ec0 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
19ed0 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
19ee0 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
19ef0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
19f00 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
19f10 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
19f20 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
19f30 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
19f40 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
19f50 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
19f60 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
19f70 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
19f80 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
19f90 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
19fa0 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
19fb0 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
19fc0 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
19fd0 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
19fe0 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
19ff0 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
1a000 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
1a010 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
1a020 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
1a030 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
1a040 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
1a050 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
1a060 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
1a070 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
1a080 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
1a090 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
1a0a0 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
1a0b0 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
1a0c0 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
1a0d0 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
1a0e0 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
1a0f0 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
1a100 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
1a110 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
1a120 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
1a130 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
1a140 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
1a150 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
1a160 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
1a170 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
1a180 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
1a190 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
1a1a0 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
1a1b0 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
1a1c0 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
1a1d0 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
1a1e0 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
1a1f0 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
1a200 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
1a210 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
1a220 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
1a230 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
1a240 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
1a250 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
1a260 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
1a270 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
1a280 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
1a290 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
1a2a0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1a2b0 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
1a2c0 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
1a2d0 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
1a2e0 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
1a2f0 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
1a300 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
1a310 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
1a320 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
1a330 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
1a340 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
1a350 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
1a360 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
1a370 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
1a380 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
1a390 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
1a3a0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
1a3b0 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
1a3c0 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
1a3d0 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
1a3e0 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
1a3f0 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
1a400 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
1a410 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
1a420 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
1a430 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
1a440 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
1a450 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
1a460 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
1a470 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a480 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1a490 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
1a4a0 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
1a4b0 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
1a4c0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
1a4d0 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
1a4e0 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
1a4f0 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
1a500 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
1a510 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
1a520 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
1a530 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
1a540 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1a550 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
1a560 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
1a570 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
1a580 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
1a590 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
1a5a0 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
1a5b0 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
1a5c0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
1a5d0 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
1a5e0 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
1a5f0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1a600 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
1a610 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
1a620 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
1a630 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1a640 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
1a650 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
1a660 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
1a670 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
1a680 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
1a690 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
1a6a0 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
1a6b0 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
1a6c0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
1a6d0 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
1a6e0 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
1a6f0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
1a700 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
1a710 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
1a720 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1a730 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
1a740 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
1a750 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
1a760 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
1a770 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
1a780 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
1a790 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
1a7a0 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
1a7b0 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
1a7c0 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
1a7d0 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
1a7e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
1a7f0 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
1a800 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
1a810 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
1a820 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
1a830 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
1a840 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
1a850 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
1a860 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
1a870 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
1a880 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1a890 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
1a8a0 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
1a8b0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
1a8c0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
1a8d0 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
1a8e0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
1a8f0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
1a900 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
1a910 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
1a920 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
1a930 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
1a940 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
1a950 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
1a960 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ];.    assert( i
1a970 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
1a980 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
1a990 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
1a9a0 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
1a9b0 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
1a9c0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
1a9d0 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
1a9e0 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
1a9f0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
1aa00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
1aa10 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
1aa20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1aa30 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
1aa40 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
1aa50 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
1aa60 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1aa70 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
1aa80 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
1aa90 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  >n;.    if( len>
1aaa0 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  0 ) memcpy(buf, 
1aab0 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
1aac0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1aad0 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
1aae0 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
1aaf0 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
1ab00 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
1ab10 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
1ab20 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
1ab30 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
1ab40 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
1ab50 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
1ab60 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
1ab70 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
1ab80 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
1ab90 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
1aba0 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
1abb0 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
1abc0 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
1abd0 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
1abe0 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
1abf0 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
1ac00 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
1ac10 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
1ac20 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
1ac30 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
1ac40 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
1ac50 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
1ac60 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
1ac70 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
1ac80 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
1ac90 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
1aca0 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
1acb0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
1acc0 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
1acd0 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
1ace0 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
1acf0 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
1ad00 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
1ad10 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
1ad20 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
1ad30 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
1ad40 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ad50 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
1ad60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
1ad70 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
1ad80 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
1ad90 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
1ada0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
1adb0 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
1adc0 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
1add0 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
1ade0 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
1adf0 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
1ae00 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
1ae10 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
1ae20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
1ae30 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
1ae40 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
1ae50 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
1ae60 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
1ae70 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
1ae80 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
1ae90 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
1aea0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
1aeb0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
1aec0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
1aed0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1aee0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
1aef0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
1af00 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
1af10 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
1af20 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
1af30 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
1af40 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
1af50 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
1af60 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
1af70 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
1af80 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
1af90 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
1afa0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
1afb0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1afc0 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
1afd0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1afe0 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
1aff0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1b000 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1b010 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
1b020 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
1b030 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1b040 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
1b050 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1b060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b070 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
1b080 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
1b090 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1b0a0 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
1b0b0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
1b0c0 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
1b0d0 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
1b0e0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
1b0f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b100 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1b110 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
1b120 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
1b130 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
1b140 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
1b150 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
1b160 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
1b170 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
1b180 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
1b190 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
1b1a0 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
1b1b0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
1b1c0 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
1b1d0 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
1b1e0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
1b1f0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
1b200 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
1b210 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
1b220 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
1b230 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
1b240 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
1b250 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
1b260 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
1b270 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
1b280 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
1b290 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
1b2a0 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
1b2b0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
1b2c0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
1b2d0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
1b2e0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1b2f0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
1b300 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1b310 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
1b320 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
1b330 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
1b340 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
1b350 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
1b360 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
1b370 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
1b380 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
1b390 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1b3a0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
1b3b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1b3c0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
1b3d0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
1b3e0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
1b3f0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
1b400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
1b410 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
1b420 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
1b430 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
1b440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1b450 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
1b460 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
1b470 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
1b480 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1b490 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a 20 49   case 10: { /* I
1b4a0 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c 79  nternal use only
1b4b0 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69 72 74  : NULL with virt
1b4c0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
1b4d0 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50 44 41           ** UPDA
1b4e0 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66 6c 61  TE no-change fla
1b4f0 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 70  g set */.      p
1b500 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1b510 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a  _Null|MEM_Zero;.
1b520 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
1b530 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  0;.      pMem->u
1b540 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20  .nZero = 0;.    
1b550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b560 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
1b570 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
1b580 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
1b590 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75  case 0: {  /* Nu
1b5a0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ll */.      /* E
1b5b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
1b5c0 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20  078-09375 Value 
1b5d0 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  is a NULL. */.  
1b5e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1b5f0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
1b600 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b610 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
1b620 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1b630 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36  F: R-44885-25196
1b640 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62   Value is an 8-b
1b650 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
1b660 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  nt.      ** inte
1b670 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1b680 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59  em->u.i = ONE_BY
1b690 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1b6a0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1b6b0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1b6c0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1b6d0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1b6e0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1b6f0 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
1b700 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
1b710 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1b720 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1b730 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c  -49794-35026 Val
1b740 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1b750 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20  an 16-bit.      
1b760 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1b770 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1b780 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1b790 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75   TWO_BYTE_INT(bu
1b7a0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1b7b0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1b7c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b7d0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1b7e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
1b7f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1b800 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1b810 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1b820 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1b830 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34  E-OF: R-37839-54
1b840 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62  301 Value is a b
1b850 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74  ig-endian 24-bit
1b860 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1b870 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1b880 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1b890 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59  ->u.i = THREE_BY
1b8a0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1b8b0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1b8c0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1b8d0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1b8e0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1b8f0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
1b900 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
1b910 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
1b920 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1b930 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1b940 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c  -01849-26079 Val
1b950 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1b960 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20  an 32-bit.      
1b970 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1b980 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1b990 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1b9a0 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62   FOUR_BYTE_INT(b
1b9b0 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50  uf);.#ifdef __HP
1b9c0 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f  _cc .      /* Wo
1b9d0 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e  rk around a sign
1b9e0 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69  -extension bug i
1b9f0 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65  n the HP compile
1ba00 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20  r for HP/UX */. 
1ba10 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26       if( buf[0]&
1ba20 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69  0x80 ) pMem->u.i
1ba30 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30   |= 0xffffffff80
1ba40 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66  000000LL;.#endif
1ba50 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1ba60 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1ba70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1ba80 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1ba90 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
1baa0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1bab0 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
1bac0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1bad0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1bae0 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34  F: R-50385-09674
1baf0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1bb00 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20  endian 48-bit.  
1bb10 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1bb20 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1bb30 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1bb40 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
1bb50 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
1bb60 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1bb70 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1bb80 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1bb90 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1bba0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1bbb0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1bbc0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
1bbd0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
1bbe0 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
1bbf0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
1bc00 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
1bc10 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1bc20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  */.      /* Thes
1bc30 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69  e use local vari
1bc40 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65  ables, so do the
1bc50 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  m in a separate 
1bc60 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
1bc70 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
1bc80 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61   to move the fra
1bc90 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  me pointer in th
1bca0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
1bcb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65  .      return se
1bcc0 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69  rialGet(buf,seri
1bcd0 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20  al_type,pMem);. 
1bce0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
1bcf0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
1bd00 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
1bd10 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
1bd20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1bd30 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36  ENCE-OF: R-12976
1bd40 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20  -22893 Value is 
1bd50 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a  the integer 0. *
1bd60 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1bd70 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d  NCE-OF: R-18143-
1bd80 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74  12121 Value is t
1bd90 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f  he integer 1. */
1bda0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1bdb0 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
1bdc0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1bdd0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1bde0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1bdf0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
1be00 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1be10 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30  DENCE-OF: R-1460
1be20 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73  6-31564 Value is
1be30 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20   a BLOB that is 
1be40 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69  (N-12)/2 bytes i
1be50 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74  n.      ** lengt
1be60 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  h..      ** EVID
1be70 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31  ENCE-OF: R-28401
1be80 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20  -00140 Value is 
1be90 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  a string in the 
1bea0 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e  text encoding an
1beb0 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33  d.      ** (N-13
1bec0 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  )/2 bytes in len
1bed0 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74  gth. */.      st
1bee0 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
1bef0 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
1bf00 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d  lob|MEM_Ephem, M
1bf10 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Str|MEM_Ephem
1bf20 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   };.      pMem->
1bf30 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
1bf40 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
1bf50 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1bf60 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
1bf70 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73  >flags = aFlag[s
1bf80 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20  erial_type&1];. 
1bf90 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d       return pMem
1bfa0 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ->n;.    }.  }. 
1bfb0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a   return 0;.}./*.
1bfc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bfd0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
1bfe0 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
1bff0 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
1c000 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
1c010 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
1c020 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
1c030 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
1c040 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
1c050 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
1c060 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1c070 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
1c080 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
1c090 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
1c0a0 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
1c0b0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
1c0c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1c0d0 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
1c0e0 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
1c0f0 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
1c100 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
1c110 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
1c120 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
1c130 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
1c140 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
1c150 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
1c160 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
1c170 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
1c180 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
1c190 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
1c1a0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
1c1b0 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
1c1c0 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
1c1d0 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
1c1e0 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
1c1f0 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
1c200 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1c210 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
1c220 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
1c230 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
1c240 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
1c250 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
1c260 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
1c270 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
1c280 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
1c290 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1c2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
1c2b0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c2c0 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55  record */.){.  U
1c2d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1c2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c2f0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1c300 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1c310 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c330 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1c340 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
1c350 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d   *p */.  nByte =
1c360 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1c370 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1c380 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1c390 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
1c3a0 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e  ld+1);.  p = (Un
1c3b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
1c3c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1c3d0 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
1c3e0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21 70  nByte);.  if( !p
1c3f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1c400 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
1c410 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
1c420 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1c430 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
1c440 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1c450 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1c460 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
1c470 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
1c480 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
1c490 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31  o->nKeyField + 1
1c4a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1c4b0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1c4c0 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
1c4d0 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
1c4e0 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c  in pKey[], popul
1c4f0 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61  ate the .** Unpa
1c500 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
1c510 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
1c520 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  y the fourth arg
1c530 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a  ument with the.*
1c540 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1c550 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64  e decoded record
1c560 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
1c570 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1c580 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
1c590 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
1c5a0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
1c5b0 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
1c5c0 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
1c5d0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1c5e0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
1c5f0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
1c600 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1c610 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
1c620 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1c630 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1c640 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70  d *p      /* Pop
1c650 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
1c660 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
1c670 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  rning. */.){.  c
1c680 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c690 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1c6a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c6b0 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b  *)pKey;.  int d;
1c6c0 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20   .  u32 idx;    
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1c6f0 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20   aKey[] to read 
1c700 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b  from */.  u16 u;
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1c730 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1c740 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  er */.  u32 szHd
1c750 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  r;.  Mem *pMem =
1c760 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e   p->aMem;..  p->
1c770 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
1c780 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1c790 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1c7a0 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  Mem) );.  idx = 
1c7b0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1c7c0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
1c7d0 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a  szHdr;.  u = 0;.
1c7e0 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1c7f0 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b  dr && d<=nKey ){
1c800 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1c810 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b  type;..    idx +
1c820 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
1c830 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c  Key[idx], serial
1c840 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d  _type);.    pMem
1c850 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  ->enc = pKeyInfo
1c860 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d  ->enc;.    pMem-
1c870 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  >db = pKeyInfo->
1c880 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d  db;.    /* pMem-
1c890 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73  >flags = 0; // s
1c8a0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1c8b0 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74  Get() will set t
1c8c0 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  his for us */.  
1c8d0 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63    pMem->szMalloc
1c8e0 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
1c8f0 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  z = 0;.    d += 
1c900 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1c910 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
1c920 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
1c930 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
1c940 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d     if( (++u)>=p-
1c950 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b  >nField ) break;
1c960 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
1c970 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  <=pKeyInfo->nKey
1c980 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
1c990 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a  ->nField = u;.}.
1c9a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c9b0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
1c9c0 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1c9d0 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
1c9e0 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
1c9f0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
1ca00 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
1ca10 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ca20 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
1ca30 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
1ca40 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
1ca50 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
1ca60 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
1ca70 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
1ca80 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
1ca90 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
1caa0 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
1cab0 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
1cac0 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
1cad0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
1cae0 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
1caf0 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
1cb00 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
1cb10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1cb20 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
1cb30 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
1cb40 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
1cb50 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  tives..**.** Ret
1cb60 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1cb70 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
1cb80 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65  ison is equivale
1cb90 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73  nt to desiredRes
1cba0 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ult..** Return f
1cbb0 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73  alse if there is
1cbc0 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e   a disagreement.
1cbd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1cbe0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1cbf0 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65  Debug(.  int nKe
1cc00 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1cc10 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1cc20 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e  ey */.  const Un
1cc30 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1cc40 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b  Key2, /* Right k
1cc50 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  ey */.  int desi
1cc60 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20  redResult       
1cc70 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74        /* Correct
1cc80 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20   answer */.){.  
1cc90 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1cca0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1ccb0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1ccc0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1ccd0 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1cce0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1ccf0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1cd00 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
1cd10 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
1cd20 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
1cd30 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1cd40 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1cd50 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
1cd60 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
1cd70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1cd80 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
1cd90 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1cda0 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
1cdb0 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
1cdc0 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
1cdd0 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
1cde0 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  fo;.  if( pKeyIn
1cdf0 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75  fo->db==0 ) retu
1ce00 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  rn 1;.  mem1.enc
1ce10 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1ce20 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
1ce30 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
1ce40 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
1ce50 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
1ce60 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
1ce70 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1ce80 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
1ce90 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
1cea0 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
1ceb0 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
1cec0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1ced0 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
1cee0 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
1cef0 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
1cf00 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
1cf10 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
1cf20 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
1cf30 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
1cf40 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
1cf50 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
1cf60 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
1cf70 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
1cf80 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
1cf90 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
1cfa0 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
1cfb0 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
1cfc0 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
1cfd0 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
1cfe0 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
1cff0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
1d000 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
1d010 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1d020 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
1d030 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
1d040 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
1d050 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
1d060 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
1d070 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
1d080 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
1d090 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
1d0a0 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
1d0b0 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
1d0c0 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
1d0d0 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
1d0e0 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
1d0f0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1d100 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a  zHdr1);.  if( sz
1d110 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74  Hdr1>98307 ) ret
1d120 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1d130 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  PT;.  d1 = szHdr
1d140 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  1;.  assert( pKe
1d150 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1d160 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1d170 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1d180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1d190 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1d1a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1d1b0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
1d1c0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1d1d0 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1d1e0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1d1f0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1d200 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
1d210 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
1d220 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
1d230 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
1d240 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
1d250 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
1d260 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
1d270 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
1d280 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
1d290 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
1d2a0 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
1d2b0 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
1d2c0 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
1d2d0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
1d2e0 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
1d2f0 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
1d300 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
1d310 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
1d320 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1d330 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
1d340 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
1d350 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
1d360 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
1d370 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
1d380 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
1d390 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
1d3a0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1d3b0 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
1d3c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
1d3d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d3e0 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1d3f0 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
1d400 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
1d410 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1d420 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
1d430 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
1d440 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1d450 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
1d460 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
1d470 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
1d480 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
1d490 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1d4a0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1d4b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
1d4c0 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
1d4d0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
1d4e0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
1d4f0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
1d500 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
1d510 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
1d520 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
1d530 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
1d540 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1d550 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1d560 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1d570 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1d580 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1d590 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1d5a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d5b0 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
1d5c0 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
1d5d0 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
1d5e0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1d5f0 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
1d600 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
1d610 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
1d620 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
1d630 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1d640 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1d650 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1d660 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1d670 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1d680 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1d690 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1d6a0 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1d6b0 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1d6c0 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1d6d0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1d6e0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1d6f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1d700 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
1d710 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1d720 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1d730 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1d740 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1d750 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1d760 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1d770 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1d780 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1d790 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1d7a0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1d7b0 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1d7c0 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
1d7d0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1d7e0 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
1d7f0 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
1d800 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
1d810 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
1d820 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1d830 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
1d840 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1d850 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
1d860 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
1d870 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
1d880 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
1d890 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1d8a0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1d8b0 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1d8c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1d8d0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1d8e0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  TE_DEBUG./*.** C
1d8f0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1d900 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61  of fields (a.k.a
1d910 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68  . columns) in th
1d920 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62  e record given b
1d930 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  y.** pKey,nKey. 
1d940 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74   The verify that
1d950 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c   this count is l
1d960 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1d970 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69  l to the.** limi
1d980 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49  t given by pKeyI
1d990 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a  nfo->nAllField..
1d9a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f  **.** If this co
1d9b0 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20  nstraint is not 
1d9c0 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65  satisfied, it me
1d9d0 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69 67  ans that the hig
1d9e0 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52  h-speed.** vdbeR
1d9f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1da00 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64  ) and vdbeRecord
1da10 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
1da20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a  routines will.**
1da30 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
1da40 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61 73  tly.  If this as
1da50 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72 65  sert() ever fire
1da60 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d  s, it probably m
1da70 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  eans.** that the
1da80 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46 69 65   KeyInfo.nKeyFie
1da90 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 41  ld or KeyInfo.nA
1daa0 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77  llField values w
1dab0 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20  ere computed.** 
1dac0 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  incorrectly..*/.
1dad0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
1dae0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1daf0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20  WithinLimits(.  
1db00 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20  int nKey, const 
1db10 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1db20 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76   The record to v
1db30 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73  erify */ .  cons
1db40 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1db50 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  nfo       /* Com
1db60 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74  pare size with t
1db70 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29  his KeyInfo */.)
1db80 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d  {.  int nField =
1db90 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   0;.  u32 szHdr;
1dba0 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33  .  u32 idx;.  u3
1dbb0 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e  2 notUsed;.  con
1dbc0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1dbd0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1dbe0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1dbf0 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52  Key;..  if( CORR
1dc00 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
1dc10 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
1dc20 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
1dc30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65  );.  assert( nKe
1dc40 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
1dc50 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b  ( szHdr<=(u32)nK
1dc60 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ey );.  while( i
1dc70 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20  dx<szHdr ){.    
1dc80 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1dc90 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74  32(aKey+idx, not
1dca0 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c  Used);.    nFiel
1dcb0 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  d++;.  }.  asser
1dcc0 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65  t( nField <= pKe
1dcd0 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1dce0 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
1dcf0 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46  fine vdbeAssertF
1dd00 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1dd10 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e  imits(A,B,C).#en
1dd20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
1dd30 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
1dd40 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
1dd50 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
1dd60 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
1dd70 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
1dd80 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1dd90 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
1dda0 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
1ddb0 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
1ddc0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
1ddd0 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
1dde0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1ddf0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1de00 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
1de10 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
1de20 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
1de30 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
1de40 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
1de50 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
1de60 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1de70 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1de80 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
1de90 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
1dea0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a  CollSeq *pColl,.
1deb0 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20    u8 *prcErr    
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f    /* If an OOM o
1dee0 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51  ccurs, set to SQ
1def0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b  LITE_NOMEM */.){
1df00 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
1df10 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
1df20 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
1df30 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
1df40 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
1df50 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
1df60 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
1df70 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
1df80 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
1df90 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
1dfa0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
1dfb0 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
1dfc0 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
1dfd0 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
1dfe0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
1dff0 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
1e000 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
1e010 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73     Mem c2;.    s
1e020 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1e030 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c1, pMem1->db
1e040 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1e050 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1e060 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e  nit(&c2, pMem1->
1e070 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1e080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1e090 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
1e0a0 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
1e0b0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
1e0c0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1e0d0 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
1e0e0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
1e0f0 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
1e100 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1e110 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
1e120 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32 20 3d 20  >enc);.    v2 = 
1e130 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1e140 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1e150 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c2, pColl->enc
1e160 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d  );.    if( (v1==
1e170 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b 0a 20  0 || v2==0) ){. 
1e180 20 20 20 20 20 69 66 28 20 70 72 63 45 72 72 20       if( prcErr 
1e190 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49  ) *prcErr = SQLI
1e1a0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1e1b0 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
1e1c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1e1d0 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
1e1e0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63 31 2e  Coll->pUser, c1.
1e1f0 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76 32 29  n, v1, c2.n, v2)
1e200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1e210 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1e220 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69  e(&c1);.    sqli
1e230 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1e240 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75  e(&c2);.    retu
1e250 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
1e260 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70 42  .** The input pB
1e270 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74 65 65  lob is guarantee
1e280 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62 20 74  d to be a Blob t
1e290 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65  hat is not marke
1e2a0 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65  d.** with MEM_Ze
1e2b0 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ro.  Return true
1e2c0 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62 65 20   if it could be 
1e2d0 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a  a zero-blob..*/.
1e2e0 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 6c 6c  static int isAll
1e2f0 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61 72 20  Zero(const char 
1e300 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
1e310 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1e320 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1e330 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e  f( z[i] ) return
1e340 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1e350 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
1e360 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20  pare two blobs. 
1e370 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1e380 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1e390 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1e3a0 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
1e3b0 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1e3c0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1e3d0 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69  second, respecti
1e3e0 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20  vely..** If one 
1e3f0 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78  blob is a prefix
1e400 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74   of the other, t
1e410 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20  hen the shorter 
1e420 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a  is the lessor..*
1e430 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  /.SQLITE_NOINLIN
1e440 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f  E int sqlite3Blo
1e450 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  bCompare(const M
1e460 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d  em *pB1, const M
1e470 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20  em *pB2){.  int 
1e480 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 70 42  c;.  int n1 = pB
1e490 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32 20 3d  1->n;.  int n2 =
1e4a0 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49   pB2->n;..  /* I
1e4b0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1e4c0 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76 61 6c   have a Blob val
1e4d0 75 65 20 74 68 61 74 20 68 61 73 20 73 6f 6d 65  ue that has some
1e4e0 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e   non-zero conten
1e4f0 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  t.  ** followed 
1e500 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 2e  by zero content.
1e510 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c 79 20    But that only 
1e520 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42 6c 6f  comes up for Blo
1e530 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 62  bs formed.  ** b
1e540 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
1e550 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20  ord opcode, and 
1e560 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76 65 72  such Blobs never
1e570 20 67 65 74 20 70 61 73 73 65 64 20 69 6e 74 6f   get passed into
1e580 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d  .  ** sqlite3Mem
1e590 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a 20 20  Compare(). */.  
1e5a0 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e 66 6c  assert( (pB1->fl
1e5b0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
1e5c0 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20  =0 || n1==0 );. 
1e5d0 20 61 73 73 65 72 74 28 20 28 70 42 32 2d 3e 66   assert( (pB2->f
1e5e0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1e5f0 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a  ==0 || n2==0 );.
1e600 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66 6c 61  .  if( (pB1->fla
1e610 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29 20 26  gs|pB2->flags) &
1e620 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1e630 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20   if( pB1->flags 
1e640 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d  & pB2->flags & M
1e650 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
1e660 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e   return pB1->u.n
1e670 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a  Zero - pB2->u.nZ
1e680 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ero;.    }else i
1e690 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20  f( pB1->flags & 
1e6a0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
1e6b0 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
1e6c0 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29  (pB2->z, pB2->n)
1e6d0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1e6e0 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e      return pB1->
1e6f0 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20 20  u.nZero - n2;.  
1e700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1e710 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42  f( !isAllZero(pB
1e720 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20 29 20  1->z, pB1->n) ) 
1e730 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1e740 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70 42 32   return n1 - pB2
1e750 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d  ->u.nZero;.    }
1e760 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d 63 6d  .  }.  c = memcm
1e770 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a  p(pB1->z, pB2->z
1e780 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e  , n1>n2 ? n2 : n
1e790 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65  1);.  if( c ) re
1e7a0 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e  turn c;.  return
1e7b0 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a   n1 - n2;.}../*.
1e7c0 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73  ** Do a comparis
1e7d0 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d  on between a 64-
1e7e0 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
1e7f0 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20  er and a 64-bit 
1e800 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a  floating-point.*
1e810 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  * number.  Retur
1e820 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1e830 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1e840 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34 29   the first (i64)
1e850 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a   is less than,.*
1e860 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  * equal to, or g
1e870 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1e880 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e  second (double).
1e890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1e8a0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1e8b0 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75  mpare(i64 i, dou
1e8c0 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69  ble r){.  if( si
1e8d0 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  zeof(LONGDOUBLE_
1e8e0 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c  TYPE)>8 ){.    L
1e8f0 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78  ONGDOUBLE_TYPE x
1e900 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54   = (LONGDOUBLE_T
1e910 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78  YPE)i;.    if( x
1e920 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1e930 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72 65      if( x>r ) re
1e940 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1e950 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1e960 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64      i64 y;.    d
1e970 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28  ouble s;.    if(
1e980 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35   r<-922337203685
1e990 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74 75  4775808.0 ) retu
1e9a0 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72  rn +1;.    if( r
1e9b0 3e 3d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  >=92233720368547
1e9c0 37 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e  75808.0 ) return
1e9d0 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36   -1;.    y = (i6
1e9e0 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79  4)r;.    if( i<y
1e9f0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1ea00 20 20 69 66 28 20 69 3e 79 20 29 20 72 65 74 75    if( i>y ) retu
1ea10 72 6e 20 2b 31 3b 0a 20 20 20 20 73 20 3d 20 28  rn +1;.    s = (
1ea20 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66  double)i;.    if
1ea30 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( s<r ) return -
1ea40 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29  1;.    if( s>r )
1ea50 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1ea60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
1ea70 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1ea80 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  he values contai
1ea90 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d  ned by the two m
1eaa0 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74  emory cells, ret
1eab0 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69  urning.** negati
1eac0 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69  ve, zero or posi
1ead0 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73  tive if pMem1 is
1eae0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1eaf0 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1eb00 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20  .** than pMem2. 
1eb10 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73  Sorting order is
1eb20 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66   NULL's first, f
1eb30 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65  ollowed by numbe
1eb40 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20  rs (integers.** 
1eb50 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65  and reals) sorte
1eb60 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66  d numerically, f
1eb70 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20  ollowed by text 
1eb80 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63  ordered by the c
1eb90 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
1eba0 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66  ence pColl and f
1ebb0 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72  inally blob's or
1ebc0 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28  dered by memcmp(
1ebd0 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  )..**.** Two NUL
1ebe0 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  L values are con
1ebf0 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79  sidered equal by
1ec00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1ec10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
1ec20 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  mCompare(const M
1ec30 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74  em *pMem1, const
1ec40 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e   Mem *pMem2, con
1ec50 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1ec60 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32  l){.  int f1, f2
1ec70 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64  ;.  int combined
1ec80 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20  _flags;..  f1 = 
1ec90 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem1->flags;.  
1eca0 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67  f2 = pMem2->flag
1ecb0 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c  s;.  combined_fl
1ecc0 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61  ags = f1|f2;.  a
1ecd0 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 56  ssert( !sqlite3V
1ece0 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70  dbeMemIsRowSet(p
1ecf0 4d 65 6d 31 29 20 26 26 20 21 73 71 6c 69 74 65  Mem1) && !sqlite
1ed00 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74  3VdbeMemIsRowSet
1ed10 28 70 4d 65 6d 32 29 20 29 3b 0a 20 0a 20 20 2f  (pMem2) );. .  /
1ed20 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1ed30 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65  s NULL, it is le
1ed40 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65  ss than the othe
1ed50 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  r. If both value
1ed60 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c  s.  ** are NULL,
1ed70 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
1ed80 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1ed90 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
1eda0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26  .    return (f2&
1edb0 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26  MEM_Null) - (f1&
1edc0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a  MEM_Null);.  }..
1edd0 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e    /* At least on
1ede0 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c  e of the two val
1edf0 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a  ues is a number.
1ee00 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1ee10 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
1ee20 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
1ee30 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1ee40 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1ee50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1ee60 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
1ee70 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
1ee80 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1ee90 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.i > pMem2->u
1eea0 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .i ) return +1;.
1eeb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1eec0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1eed0 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61  1 & f2 & MEM_Rea
1eee0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1eef0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20  f( pMem1->u.r < 
1ef00 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1ef10 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1ef20 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70  ( pMem1->u.r > p
1ef30 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1ef40 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1ef50 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1ef60 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
1ef70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1ef80 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
1ef90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1efa0 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46  turn sqlite3IntF
1efb0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1efc0 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75  1->u.i, pMem2->u
1efd0 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1efe0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1eff0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1f000 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1f010 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1f020 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1f030 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1f040 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69      return -sqli
1f050 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1f060 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70  re(pMem2->u.i, p
1f070 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem1->u.r);.    
1f080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f090 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1f0a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1f0b0 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20  turn +1;.  }..  
1f0c0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1f0d0 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
1f0e0 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
1f0f0 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
1f100 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1f110 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
1f120 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
1f130 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
1f140 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
1f150 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1f160 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
1f170 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
1f180 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1f190 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1f1a0 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
1f1b0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1f1c0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1f1d0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1f1e0 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
1f1f0 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65  Mem2->enc || pMe
1f200 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  m1->db->mallocFa
1f210 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
1f220 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1f230 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a  SQLITE_UTF8 || .
1f240 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d              pMem
1f250 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1f260 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d  TF16LE || pMem1-
1f270 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1f280 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  16BE );..    /* 
1f290 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
1f2a0 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64  quence must be d
1f2b0 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70  efined at this p
1f2c0 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20  oint, even if.  
1f2d0 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65    ** the user de
1f2e0 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  letes the collat
1f2f0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74  ion sequence aft
1f300 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  er the vdbe prog
1f310 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  ram is.    ** co
1f320 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73  mpiled (this was
1f330 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20   not always the 
1f340 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  case)..    */.  
1f350 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c    assert( !pColl
1f360 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   || pColl->xCmp 
1f370 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  );..    if( pCol
1f380 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  l ){.      retur
1f390 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  n vdbeCompareMem
1f3a0 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d  String(pMem1, pM
1f3b0 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a  em2, pColl, 0);.
1f3c0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
1f3d0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77  a NULL pointer w
1f3e0 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  as passed as the
1f3f0 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f   collate functio
1f400 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  n, fall through.
1f410 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c      ** to the bl
1f420 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20  ob case and use 
1f430 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
1f440 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61  }. .  /* Both va
1f450 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f  lues must be blo
1f460 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69  bs.  Compare usi
1f470 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  ng memcmp().  */
1f480 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1f490 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65  3BlobCompare(pMe
1f4a0 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a  m1, pMem2);.}...
1f4b0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
1f4c0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1f4d0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1f4e0 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70   is a serial-typ
1f4f0 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73  e that.** corres
1f500 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65  ponds to an inte
1f510 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73  ger - all values
1f520 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39   between 1 and 9
1f530 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65   inclusive .** e
1f540 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63  xcept 7. The sec
1f550 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ond points to a 
1f560 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1f570 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  g an integer val
1f580 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64  ue.** serialized
1f590 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65   according to se
1f5a0 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20  rial_type. This 
1f5b0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
1f5c0 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74  lizes.** and ret
1f5d0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a  urns the value..
1f5e0 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64  */.static i64 vd
1f5f0 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1f600 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  t(u32 serial_typ
1f610 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  e, const u8 *aKe
1f620 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61  y){.  u32 y;.  a
1f630 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1f640 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  B || (serial_typ
1f650 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74  e>=1 && serial_t
1f660 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c  ype<=9 && serial
1f670 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73  _type!=7) );.  s
1f680 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1f690 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30  pe ){.    case 0
1f6a0 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20  :.    case 1:.  
1f6b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1f6c0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1f6d0 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42      return ONE_B
1f6e0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1f6f0 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
1f700 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1f710 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1f720 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45   return TWO_BYTE
1f730 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1f740 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65  case 3:.      te
1f750 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1f760 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1f770 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f  turn THREE_BYTE_
1f780 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1f790 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74  ase 4: {.      t
1f7a0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1f7b0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79  &0x80 );.      y
1f7c0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1f7d0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72  T(aKey);.      r
1f7e0 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74  eturn (i64)*(int
1f7f0 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)&y;.    }.    
1f800 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20  case 5: {.      
1f810 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1f820 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1f830 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45  return FOUR_BYTE
1f840 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
1f850 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1f860 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1f870 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1f880 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34  e 6: {.      u64
1f890 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
1f8a0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1f8b0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1f8c0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1f8d0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
1f8e0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1f8f0 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74  ey+4);.      ret
1f900 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29  urn (i64)*(i64*)
1f910 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  &x;.    }.  }.. 
1f920 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
1f930 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a  type - 8);.}../*
1f940 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f950 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
1f960 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
1f970 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
1f980 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
1f990 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
1f9a0 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
1f9b0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
1f9c0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
1f9d0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
1f9e0 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
1f9f0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
1fa00 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
1fa10 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
1fa20 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
1fa30 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
1fa40 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
1fa50 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1fa60 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
1fa70 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
1fa80 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
1fa90 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
1faa0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
1fab0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
1fac0 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
1fad0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b   If argument bSk
1fae0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
1faf0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1fb00 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1fb10 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74  s already.** det
1fb20 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1fb30 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1fb40 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1fb50 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ual..**.** Key1 
1fb60 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
1fb70 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
1fb80 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
1fb90 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c  of fields. If al
1fba0 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61  l .** fields tha
1fbb0 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68  t appear in both
1fbc0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c   keys are equal,
1fbd0 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65   then pPKey2->de
1fbe0 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20  fault_rc is .** 
1fbf0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1fc00 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  If database corr
1fc10 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76  uption is discov
1fc20 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32  ered, set pPKey2
1fc30 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a  ->errCode to .**
1fc40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1fc50 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66  and return 0. If
1fc60 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73   an OOM error is
1fc70 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a   encountered, .*
1fc80 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  * pPKey2->errCod
1fc90 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
1fca0 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66  TE_NOMEM and, if
1fcb0 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
1fcc0 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66   the.** malloc-f
1fcd0 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f  ailed flag set o
1fce0 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
1fcf0 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  e (pPKey2->pKeyI
1fd00 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74  nfo->db)..*/.int
1fd10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1fd20 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1fd30 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  p(.  int nKey1, 
1fd40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1fd50 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
1fd60 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1fd70 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20  cord *pPKey2,   
1fd80 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1fd90 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  ey */.  int bSki
1fda0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
1fdb0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1fdc0 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72  ue, skip the fir
1fdd0 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  st field */.){. 
1fde0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1fe10 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
1fe20 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
1fe30 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
1fe60 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61  t field to compa
1fe70 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  re */.  u32 szHd
1fe80 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
1fe90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1fea0 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  of record header
1feb0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1fec0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fee0 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
1fef0 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72  t type in header
1ff00 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   */.  int rc = 0
1ff10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ff20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1ff30 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  value */.  Mem *
1ff40 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61  pRhs = pPKey2->a
1ff50 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  Mem;       /* Ne
1ff60 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  xt field of pPKe
1ff70 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  y2 to compare */
1ff80 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1ff90 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Info;.  const un
1ffa0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1ffb0 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
1ffc0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1ffd0 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  1;.  Mem mem1;..
1ffe0 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73    /* If bSkip is
1fff0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
20000 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
20010 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  dy determined th
20020 61 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  at the first.  *
20030 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
20040 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  n the keys are e
20050 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61  qual. Fix the va
20060 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69  rious stack vari
20070 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68  ables so.  ** th
20080 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  at this routine 
20090 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67  begins comparing
200a0 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66   at the second f
200b0 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62  ield. */.  if( b
200c0 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20  Skip ){.    u32 
200d0 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31  s1;.    idx1 = 1
200e0 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26   + getVarint32(&
200f0 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20  aKey1[1], s1);. 
20100 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79     szHdr1 = aKey
20110 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73  1[0];.    d1 = s
20120 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56  zHdr1 + sqlite3V
20130 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
20140 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b  (s1);.    i = 1;
20150 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d  .    pRhs++;.  }
20160 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d  else{.    idx1 =
20170 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
20180 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20  y1, szHdr1);.   
20190 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
201a0 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e    if( d1>(unsign
201b0 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20  ed)nKey1 ){ .   
201c0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
201d0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
201e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
201f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
20200 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
20210 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b      }.    i = 0;
20220 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59  .  }..  VVA_ONLY
20230 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
20240 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
20250 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
20260 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
20270 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
20280 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  ->pKeyInfo->nAll
20290 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
202a0 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c  Field .       ||
202b0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
202c0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
202d0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
202e0 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
202f0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
20300 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
20310 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
20320 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
20330 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
20340 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
20350 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f  ial_type;..    /
20360 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65  * RHS is an inte
20370 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ger */.    if( p
20380 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
20390 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65  _Int ){.      se
203a0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
203b0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74  1[idx1];.      t
203c0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
203d0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
203e0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
203f0 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
20400 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
20410 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
20420 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
20430 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
20440 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
20450 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
20460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20470 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
20480 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
20490 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
204a0 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74       rc = -sqlit
204b0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
204c0 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d  e(pRhs->u.i, mem
204d0 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  1.u.r);.      }e
204e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
204f0 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72   lhs = vdbeRecor
20500 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61  dDecodeInt(seria
20510 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64  l_type, &aKey1[d
20520 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34  1]);.        i64
20530 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69   rhs = pRhs->u.i
20540 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68  ;.        if( lh
20550 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s<rhs ){.       
20560 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
20570 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68      }else if( lh
20580 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s>rhs ){.       
20590 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
205a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
205b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
205c0 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65  is real */.    e
205d0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
205e0 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
205f0 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
20600 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
20610 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  ];.      if( ser
20620 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
20630 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
20640 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72  l types 12 or gr
20650 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67  eater are string
20660 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65  s and blobs (gre
20670 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  ater than.      
20680 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54    ** numbers). T
20690 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61  ypes 10 and 11 a
206a0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65  re currently "re
206b0 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
206c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  e .        ** us
206d0 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  e", so it doesn'
206e0 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20  t really matter 
206f0 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  what the results
20700 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20   of comparing.  
20710 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f        ** them to
20720 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73   numberic values
20730 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20   are.  */.      
20740 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
20750 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
20760 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
20770 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
20780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
207a0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
207b0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
207c0 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
207d0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
207e0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==7 ){.         
207f0 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52   if( mem1.u.r<pR
20800 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
20810 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
20820 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
20830 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68  if( mem1.u.r>pRh
20840 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20  s->u.r ){.      
20850 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
20860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20880 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20890 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
208a0 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e  mem1.u.i, pRhs->
208b0 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  u.r);.        }.
208c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
208d0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
208e0 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
208f0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
20900 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
20910 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
20920 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
20930 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
20940 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
20950 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
20960 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
20970 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
20980 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
20990 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
209a0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
209b0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
209c0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
209d0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
209e0 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
209f0 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
20a00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
20a10 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
20a20 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
20a30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20a40 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
20a50 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
20a60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
20a70 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
20a80 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
20a90 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
20aa0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20ab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20ac0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
20ad0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
20ae0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
20af0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
20b00 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4b 65 79   }else if( (pKey
20b10 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
20b20 4b 65 79 49 6e 66 6f 29 2d 3e 61 43 6f 6c 6c 5b  KeyInfo)->aColl[
20b30 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
20b40 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
20b50 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20  nfo->enc;.      
20b60 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b      mem1.db = pK
20b70 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
20b80 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73        mem1.flags
20b90 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20   = MEM_Str;.    
20ba0 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28        mem1.z = (
20bb0 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d  char*)&aKey1[d1]
20bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20bd0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
20be0 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20  tring(.         
20bf0 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73       &mem1, pRhs
20c00 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
20c10 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65  l[i], &pPKey2->e
20c20 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20  rrCode.         
20c30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
20c40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
20c50 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31   nCmp = MIN(mem1
20c60 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  .n, pRhs->n);.  
20c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
20c80 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
20c90 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
20ca0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20cb0 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e  ==0 ) rc = mem1.
20cc0 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20  n - pRhs->n; .  
20cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20ce0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
20cf0 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  S is a blob */. 
20d00 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
20d10 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
20d20 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ob ){.      asse
20d30 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61 67 73  rt( (pRhs->flags
20d40 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
20d50 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b  || pRhs->n==0 );
20d60 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
20d70 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
20d80 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
20d90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
20da0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
20db0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
20dc0 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73  al_type<12 || (s
20dd0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
20de0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
20df0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
20e00 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
20e10 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
20e20 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
20e30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20e40 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73   (d1+nStr)==(uns
20e50 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
20e60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20e70 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75   (d1+nStr+1)==(u
20e80 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
20e90 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
20ea0 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e  +nStr) > (unsign
20eb0 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
20ec0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
20ed0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
20ee0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20ef0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
20f00 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
20f10 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
20f20 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
20f30 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
20f40 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
20f50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
20f60 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 74  isAllZero((const
20f70 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31   char*)&aKey1[d1
20f80 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20 20 20  ],nStr) ){.     
20f90 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
20fa0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
20fc0 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 75 2e   nStr - pRhs->u.
20fd0 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 20  nZero;.         
20fe0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
20ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
21000 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c  nCmp = MIN(nStr,
21010 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
21020 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
21030 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
21040 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
21050 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
21060 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70   ) rc = nStr - p
21070 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Rhs->n;.        
21080 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
21090 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e  .    /* RHS is n
210a0 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b  ull */.    else{
210b0 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
210c0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
210d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65  ;.      rc = (se
210e0 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20  rial_type!=0);. 
210f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
21100 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
21110 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
21120 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
21130 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21140 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -rc;.      }.  
21150 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65      assert( vdbe
21160 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
21170 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
21180 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a   pPKey2, rc) );.
21190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
211a0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
211b0 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
211c0 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
211d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
211e0 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  }..    i++;.    
211f0 69 66 28 20 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e  if( i==pPKey2->n
21200 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20  Field ) break;. 
21210 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64     pRhs++;.    d
21220 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
21230 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
21240 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
21250 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56  idx1 += sqlite3V
21260 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f  arintLen(serial_
21270 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
21280 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29   idx1<(unsigned)
21290 73 7a 48 64 72 31 20 26 26 20 64 31 3c 3d 28 75  szHdr1 && d1<=(u
212a0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
212b0 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
212c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
212d0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
212e0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
212f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
21300 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
21310 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
21320 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
21330 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
21340 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
21350 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
21360 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
21370 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
21380 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
21390 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
213a0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
213b0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
213c0 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
213d0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
213e0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
213f0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
21400 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
21410 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
21420 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
21430 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61  * value.  */.  a
21440 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
21450 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62  B .       || vdb
21460 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
21470 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
21480 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32  , pPKey2, pPKey2
21490 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20  ->default_rc) . 
214a0 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
214b0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
214c0 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
214d0 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65  .  pPKey2->eqSee
214e0 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  n = 1;.  return 
214f0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
21500 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
21510 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
21520 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
21530 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
21540 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
21550 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
21560 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
21570 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
21580 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  key */.){.  retu
21590 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
215a0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
215b0 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
215c0 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a  , pPKey2, 0);.}.
215d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
215e0 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
215f0 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
21600 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21610 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
21620 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
21630 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
21640 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
21650 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
21660 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
21670 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
21680 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
21690 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
216a0 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
216b0 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
216c0 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
216d0 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
216e0 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
216f0 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
21700 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
21710 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
21720 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
21730 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
21740 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
21750 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
21760 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
21770 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
21780 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
21790 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
217a0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
217b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
217c0 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
217d0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
217e0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20   const u8 *aKey 
217f0 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  = &((const u8*)p
21800 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38  Key1)[*(const u8
21810 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b  *)pKey1 & 0x3F];
21820 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
21830 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a  pe = ((const u8*
21840 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e  )pKey1)[1];.  in
21850 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a  t res;.  u32 y;.
21860 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76    u64 x;.  i64 v
21870 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20  ;.  i64 lhs;..  
21880 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
21890 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
218a0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
218b0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
218c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75  ;.  assert( (*(u
218d0 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20  8*)pKey1)<=0x3F 
218e0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
218f0 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
21900 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
21910 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
21920 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
21930 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
21940 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
21950 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
21960 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
21970 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21980 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
21990 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
219a0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
219b0 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  lhs = TWO_BYTE_I
219c0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
219d0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
219e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
219f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
21a00 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
21a10 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
21a20 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45        lhs = THRE
21a30 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
21a40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21a50 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
21a60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21a70 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
21a80 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
21a90 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20  eger */.      y 
21aa0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
21ab0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68  (aKey);.      lh
21ac0 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  s = (i64)*(int*)
21ad0 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &y;.      testca
21ae0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
21af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21b00 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
21b10 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
21b20 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
21b30 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  lhs = FOUR_BYTE_
21b40 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
21b50 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
21b60 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
21b70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21b80 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
21b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21ba0 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38    case 6: { /* 8
21bb0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
21bc0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20  eger */.      x 
21bd0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
21be0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20  (aKey);.      x 
21bf0 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
21c00 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
21c10 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  4);.      lhs = 
21c20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
21c30 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
21c40 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21c50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21c60 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  8: .      lhs = 
21c70 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
21c80 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20      case 9:.    
21c90 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20    lhs = 1;.     
21ca0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
21cb0 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20  This case could 
21cc0 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f  be removed witho
21cd0 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
21ce0 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69  results of runni
21cf0 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  ng.    ** this c
21d00 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69  ode. Including i
21d10 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20  t causes gcc to 
21d20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65  generate a faste
21d30 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a  r switch .    **
21d40 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63   statement (sinc
21d50 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73  e the range of s
21d60 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f  witch targets no
21d70 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f  w starts at zero
21d80 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63   and.    ** is c
21d90 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64  ontiguous) but d
21da0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
21db0 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65  y duplicate code
21dc0 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
21dd0 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20  .    ** (as gcc 
21de0 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68  is clever enough
21df0 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
21e00 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e  two like cases).
21e10 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   Other .    ** c
21e20 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62  ompilers might b
21e30 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a  e similar.  */ .
21e40 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65      case 0: case
21e50 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e   7:.      return
21e60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21e70 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
21e80 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
21e90 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
21ea0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
21eb0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21ec0 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
21ed0 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a  1, pPKey2);.  }.
21ee0 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61  .  v = pPKey2->a
21ef0 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66  Mem[0].u.i;.  if
21f00 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v>lhs ){.    r
21f10 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
21f20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c  .  }else if( v<l
21f30 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
21f40 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65  pPKey2->r2;.  }e
21f50 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
21f60 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
21f70 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
21f80 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
21f90 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43  eys are equal. C
21fa0 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c  ompare the trail
21fb0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ing .    ** fiel
21fc0 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  ds.  */.    res 
21fd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
21fe0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
21ff0 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
22000 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d   pPKey2, 1);.  }
22010 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
22020 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
22030 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
22040 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72  e equal and ther
22050 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e  e are no trailin
22060 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e  g.    ** fields.
22070 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   Return pPKey2->
22080 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68  default_rc in th
22090 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
220a0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
220b0 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50  fault_rc;.    pP
220c0 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31  Key2->eqSeen = 1
220d0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
220e0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
220f0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
22100 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
22110 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  s) );.  return r
22120 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  es;.}../*.** Thi
22130 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
22140 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
22150 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
22160 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
22170 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
22180 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
22190 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72   pPKey2 is a str
221a0 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68  ing, that (b) th
221b0 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a  e first field.**
221c0 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
221d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
221e0 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74  ARY and (c) that
221f0 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
22200 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61  der varint .** a
22210 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
22220 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
22230 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
22240 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
22250 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
22260 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74  areString(.  int
22270 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
22280 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
22290 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
222a0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
222b0 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
222c0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
222d0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d  onst u8 *aKey1 =
222e0 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79   (const u8*)pKey
222f0 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  1;.  int serial_
22300 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b  type;.  int res;
22310 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ..  assert( pPKe
22320 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67  y2->aMem[0].flag
22330 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
22340 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
22350 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
22360 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  s(nKey1, pKey1, 
22370 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
22380 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32  );.  getVarint32
22390 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69  (&aKey1[1], seri
223a0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20  al_type);.  if( 
223b0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
223c0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
223d0 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20  y2->r1;      /* 
223e0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
223f0 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e   a number or a n
22400 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ull */.  }else i
22410 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
22420 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20   & 0x01) ){ .   
22430 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
22440 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  2;      /* (pKey
22450 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c  1/nKey1) is a bl
22460 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ob */.  }else{. 
22470 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
22480 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69   int nStr;.    i
22490 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31  nt szHdr = aKey1
224a0 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d  [0];..    nStr =
224b0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
224c0 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28  ) / 2;.    if( (
224d0 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20  szHdr + nStr) > 
224e0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70  nKey1 ){.      p
224f0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
22500 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
22510 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
22520 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
22530 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
22540 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d    }.    nCmp = M
22550 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  IN( pPKey2->aMem
22560 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20  [0].n, nStr );. 
22570 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
22580 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70  &aKey1[szHdr], p
22590 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a  PKey2->aMem[0].z
225a0 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66  , nCmp);..    if
225b0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
225c0 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70    res = nStr - p
225d0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
225e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
225f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
22600 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
22610 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
22620 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
22630 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
22640 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
22650 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
22660 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22670 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
22680 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
22690 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  rc;.          pP
226a0 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31  Key2->eqSeen = 1
226b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
226c0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e    }else if( res>
226d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  0 ){.        res
226e0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
226f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22700 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
22710 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ->r1;.      }.  
22720 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e    }else if( res>
22730 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
22740 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
22750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
22760 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
22770 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
22780 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
22790 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
227a0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
227b0 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c  , res).       ||
227c0 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20   CORRUPT_DB.    
227d0 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b     || pPKey2->pK
227e0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
227f0 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
22800 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
22810 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
22820 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
22830 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22840 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c  pare() compatibl
22850 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75  e function.** su
22860 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61  itable for compa
22870 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20  ring serialized 
22880 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75  records to the u
22890 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70  npacked record p
228a0 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
228b0 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
228c0 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20  /.RecordCompare 
228d0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
228e0 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52  ompare(UnpackedR
228f0 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20  ecord *p){.  /* 
22900 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
22910 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72  areInt() and var
22920 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
22930 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73  String() both as
22940 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  sume.  ** that t
22950 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
22960 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63  r varint that oc
22970 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72  curs at the star
22980 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64  t of each record
22990 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20  .  ** fits in a 
229a0 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65  single byte (i.e
229b0 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73  . is 127 or less
229c0 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  ). varintRecordC
229d0 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a  ompareInt().  **
229e0 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
229f0 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  at it is safe to
22a00 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66   overread a buff
22a10 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74  er by at least t
22a20 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d  he .  ** maximum
22a30 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20   possible legal 
22a40 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73  header size plus
22a50 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73   8 bytes. Becaus
22a60 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  e there is.  ** 
22a70 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
22a80 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75   at least 74 (bu
22a90 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73  t not 136) bytes
22aa0 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c   of padding foll
22ab0 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20  owing each.  ** 
22ac0 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f  buffer passed to
22ad0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
22ae0 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d  pareInt() this m
22af0 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65  akes it convenie
22b00 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74  nt to.  ** limit
22b10 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
22b20 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79   header to 64 by
22b30 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65  tes in cases whe
22b40 72 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65  re the first fie
22b50 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e  ld.  ** is an in
22b60 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger..  **.  **
22b70 20 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79   The easiest way
22b80 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
22b90 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e   limit is to con
22ba0 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72  sider only recor
22bb0 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20  ds with.  ** 13 
22bc0 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20  fields or less. 
22bd0 49 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65  If the first fie
22be0 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ld is an integer
22bf0 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  , the maximum le
22c00 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  gal.  ** header 
22c10 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20  size is (12*5 + 
22c20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a  1 + 1) bytes.  *
22c30 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49  /.  if( p->pKeyI
22c40 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d  nfo->nAllField<=
22c50 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
22c60 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
22c70 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
22c80 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
22c90 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
22ca0 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
22cb0 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
22cc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22cd0 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
22ce0 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
22cf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
22d00 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
22d10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
22d20 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22d30 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
22d40 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
22d50 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
22d60 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
22d70 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
22d80 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
22d90 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
22da0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
22db0 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
22dc0 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
22dd0 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
22de0 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
22df0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22e00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
22e10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22e20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
22e30 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
22e40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
22e50 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22e60 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
22e70 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
22e80 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
22e90 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
22ea0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
22eb0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
22ec0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
22ed0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
22ee0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
22ef0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
22f00 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
22f10 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
22f20 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
22f30 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
22f40 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
22f50 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
22f60 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
22f70 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
22f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
22f90 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
22fa0 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
22fb0 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
22fc0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
22fd0 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
22fe0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
22ff0 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
23000 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
23010 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
23020 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
23030 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
23040 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
23050 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
23060 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
23070 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
23080 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
23090 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
230a0 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
230b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
230c0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
230d0 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
230e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
230f0 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
23100 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
23110 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
23120 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
23130 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
23140 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
23150 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
23160 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
23170 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
23180 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
23190 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
231a0 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
231b0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
231c0 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
231d0 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
231e0 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
231f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23200 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
23210 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
23220 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
23230 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
23240 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72  e(pCur);.  asser
23250 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
23260 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
23270 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
23280 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
23290 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
232a0 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
232b0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
232c0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
232d0 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
232e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
232f0 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
23300 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
23310 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
23320 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
23330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
23340 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
23350 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
23360 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
23370 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
23380 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
23390 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
233a0 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
233b0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
233c0 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
233d0 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
233e0 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
233f0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
23400 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
23410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
23420 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
23430 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
23440 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
23450 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
23460 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
23470 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
23480 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
23490 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
234a0 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
234b0 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
234c0 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
234d0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
234e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
234f0 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
23500 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
23510 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
23520 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
23530 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
23540 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
23550 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
23560 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
23570 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
23580 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
23590 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
235a0 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
235b0 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
235c0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
235d0 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
235e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
235f0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
23600 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
23610 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
23620 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
23630 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
23640 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
23650 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
23660 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
23670 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
23680 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
23690 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
236a0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
236b0 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
236c0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
236d0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
236e0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
236f0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
23700 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
23710 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
23720 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
23730 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
23740 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
23750 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
23760 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
23770 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
23780 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
23790 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
237a0 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
237b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
237c0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
237d0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
237e0 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
237f0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
23800 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
23810 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
23820 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
23830 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
23840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23850 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
23860 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
23870 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
23880 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
23890 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
238a0 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
238b0 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
238c0 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
238d0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
238e0 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
238f0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
23900 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
23910 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
23920 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
23930 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
23940 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
23950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
23960 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
23970 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
23980 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
23990 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
239a0 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
239b0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
239c0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
239d0 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
239e0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
239f0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
23a00 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
23a10 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
23a20 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
23a30 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
23a40 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
23a50 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
23a60 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
23a70 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
23a80 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
23a90 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
23aa0 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
23ab0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
23ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
23ad0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
23ae0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
23af0 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
23b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
23b10 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
23b20 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
23b30 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
23b40 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
23b50 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
23b60 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
23b70 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
23b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b90 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
23ba0 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
23bb0 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
23bc0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
23bd0 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
23be0 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b   *pCur;.  Mem m;
23bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ..  assert( pC->
23c00 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
23c10 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75  E_BTREE );.  pCu
23c20 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
23c30 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  or;.  assert( sq
23c40 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23c50 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
23c60 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71  .  nCellKey = sq
23c70 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
23c80 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f  dSize(pCur);.  /
23c90 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20  * nCellKey will 
23ca0 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65  always be betwee
23cb0 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66  n 0 and 0xffffff
23cc0 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ff because of th
23cd0 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20  e way.  ** that 
23ce0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
23cf0 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47  r() and sqlite3G
23d00 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65  etVarint32() are
23d10 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a   implemented */.
23d20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
23d30 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
23d40 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  7fffffff ){.    
23d50 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  *res = 0;.    re
23d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23d70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
23d80 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
23d90 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20  it(&m, db, 0);. 
23da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
23db0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
23dc0 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  ur, 0, (u32)nCel
23dd0 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28  lKey, &m);.  if(
23de0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
23df0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73  n rc;.  }.  *res
23e00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
23e10 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
23e20 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  kip(m.n, m.z, pU
23e30 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20 20 73  npacked, 0);.  s
23e40 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
23e50 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
23e60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23e70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
23e80 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
23e90 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
23ea0 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
23eb0 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
23ec0 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
23ed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
23ee0 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
23ef0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
23f00 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
23f10 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
23f20 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
23f30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23f40 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
23f50 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
23f60 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
23f70 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
23f80 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
23f90 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
23fa0 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
23fb0 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
23fc0 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
23fd0 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
23fe0 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
23ff0 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
24000 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
24010 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
24020 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
24030 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
24040 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
24050 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
24060 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
24070 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
24080 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
24090 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
240a0 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
240b0 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
240c0 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
240d0 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
240e0 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
240f0 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
24100 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
24110 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
24120 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
24130 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
24140 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
24150 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
24160 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
24170 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
24180 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
24190 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
241a0 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
241b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
241c0 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20  obsolete..**.** 
241d0 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c 20 74  If iCode is 1, t
241e0 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e 20 69  hen expiration i
241f0 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68 65  s advisory.  The
24200 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f 75 6c   statement shoul
24210 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70 61 72  d.** be reprepar
24220 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
24230 72 65 73 74 61 72 74 65 64 2c 20 62 75 74 20 69  restarted, but i
24240 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
24250 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20 69 73  running.** it is
24260 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75 6e 20   allowed to run 
24270 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a  to completion..*
24280 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c 79 2c  *.** Internally,
24290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
242a0 75 73 74 20 73 65 74 73 20 74 68 65 20 56 64 62  ust sets the Vdb
242b0 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67 20 6f  e.expired flag o
242c0 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61 72 65  n all.** prepare
242d0 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  d statements.  T
242e0 68 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  he flag is set t
242f0 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d 65 64  o 1 for an immed
24300 69 61 74 65 20 65 78 70 69 72 61 74 69 6f 6e 0a  iate expiration.
24310 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20 32 20  ** and set to 2 
24320 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72 79 20  for an advisory 
24330 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  expiration..*/.v
24340 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
24350 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
24360 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nts(sqlite3 *db,
24370 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20 20 56   int iCode){.  V
24380 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
24390 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
243a0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
243b0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 69 43   p->expired = iC
243c0 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ode+1;.  }.}../*
243d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
243e0 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
243f0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
24400 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
24410 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
24420 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
24430 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
24440 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49 54 45  eturn the SQLITE
24450 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73 20 66  _PREPARE flags f
24460 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a 75 38  or a Vdbe..*/.u8
24470 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 70   sqlite3VdbePrep
24480 61 72 65 46 6c 61 67 73 28 56 64 62 65 20 2a 76  areFlags(Vdbe *v
24490 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 70  ){.  return v->p
244a0 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a  repFlags;.}../*.
244b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
244c0 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
244d0 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
244e0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
244f0 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20   value bound.** 
24500 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f  parameter iVar o
24510 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20  f VM v. Except, 
24520 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
24530 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74  an SQL NULL, ret
24540 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61  urn .** 0 instea
24550 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  d. Unless it is 
24560 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69  NULL, apply affi
24570 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66  nity aff (one of
24580 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
24590 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20  *.** constants) 
245a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  to the value bef
245b0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74  ore returning it
245c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
245d0 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20  rned value must 
245e0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
245f0 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
24600 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
24610 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
24620 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  e *sqlite3VdbeGe
24630 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65  tBoundValue(Vdbe
24640 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75   *v, int iVar, u
24650 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74  8 aff){.  assert
24660 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
24670 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  ( v ){.    Mem *
24680 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b  pMem = &v->aVar[
24690 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  iVar-1];.    ass
246a0 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c 61  ert( (v->db->fla
246b0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62  gs & SQLITE_Enab
246c0 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20 20  leQPSG)==0 );.  
246d0 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
246e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
246f0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
24700 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
24710 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
24720 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
24730 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
24740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
24750 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
24760 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
24770 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
24780 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
24790 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
247a0 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  F8);.      }.   
247b0 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
247c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
247d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
247e0 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
247f0 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
24800 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
24810 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
24820 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
24830 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
24840 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
24850 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
24860 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
24870 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
24880 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
24890 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
248a0 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
248b0 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
248c0 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 61 73  ( iVar>0 );.  as
248d0 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c  sert( (v->db->fl
248e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61  ags & SQLITE_Ena
248f0 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20  bleQPSG)==0 );. 
24900 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20 29 7b   if( iVar>=32 ){
24910 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
24920 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b 0a 20  |= 0x80000000;. 
24930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
24940 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
24950 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
24960 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75    }.}../*.** Cau
24970 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f  se a function to
24980 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   throw an error 
24990 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c 20 66  if it was call f
249a0 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e 63 0a  rom OP_PureFunc.
249b0 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 4f  ** rather than O
249c0 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  P_Function..**.*
249d0 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20 6d 65  * OP_PureFunc me
249e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 75 6e  ans that the fun
249f0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 65  ction must be de
24a00 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61 6e 64  terministic, and
24a10 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72 6f 77   should.** throw
24a20 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20   an error if it 
24a30 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74 73 20  is given inputs 
24a40 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65 20  that would make 
24a50 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  it non-determini
24a60 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  stic..** This ro
24a70 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
24a80 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20 66 75   by date/time fu
24a90 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65  nctions that use
24aa0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
24ab0 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73 20 73  ic.** features s
24ac0 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a 2a 2f  uch as 'now'..*/
24ad0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 74 50  .int sqlite3NotP
24ae0 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  ureFunc(sqlite3_
24af0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
24b00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
24b10 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
24b20 41 54 34 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  AT4.  if( pCtx->
24b30 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74 75 72  pVdbe==0 ) retur
24b40 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  n 1;.#endif.  if
24b50 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d 3e 61  ( pCtx->pVdbe->a
24b60 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e 6f 70  Op[pCtx->iOp].op
24b70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46 75 6e  code==OP_PureFun
24b80 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
24b90 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
24ba0 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e 6f 6e  tx, .       "non
24bb0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66  -deterministic f
24bc0 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64 65 78  unction in index
24bd0 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 43   expression or C
24be0 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 22  HECK constraint"
24bf0 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a 20 20  ,.       -1);.  
24c00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
24c10 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
24c20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24c30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
24c40 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
24c50 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
24c60 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65  t from an sqlite
24c70 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28  3_vtab.zErrMsg (
24c80 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
24c90 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
24ca0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
24cb0 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64  alloc) into a Vd
24cc0 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  be.zErrMsg (text
24cd0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
24ce0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
24cf0 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
24d00 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc)..*/.void sql
24d10 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
24d20 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71  rmsg(Vdbe *p, sq
24d30 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
24d40 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d  b){.  if( pVtab-
24d50 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
24d60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
24d70 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >db;.    sqlite3
24d80 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
24d90 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
24da0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
24db0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74  DbStrDup(db, pVt
24dc0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
24dd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24de0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
24df0 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d      pVtab->zErrM
24e00 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  sg = 0;.  }.}.#e
24e10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
24e20 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
24e30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
24e40 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
24e50 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20  ATE_HOOK../*.** 
24e60 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
24e70 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
24e80 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20  LL, release any 
24e90 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
24ea0 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
24eb0 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  the memory cells
24ec0 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b   in the p->aMem[
24ed0 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72  ] array. Also fr
24ee0 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52  ee the UnpackedR
24ef0 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
24f00 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67  re itself, using
24f10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
24f20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
24f30 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
24f40 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65   free UnpackedRe
24f50 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20  cord structures 
24f60 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
24f70 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65  the vdbeUnpackRe
24f80 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  cord() function 
24f90 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69  found in vdbeapi
24fa0 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .c..*/.static vo
24fb0 69 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  id vdbeFreeUnpac
24fc0 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ked(sqlite3 *db,
24fd0 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70   int nField, Unp
24fe0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
24ff0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
25000 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
25010 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b  =0; i<nField; i+
25020 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  +){.      Mem *p
25030 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69  Mem = &p->aMem[i
25040 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ];.      if( pMe
25050 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m->zMalloc ) sql
25060 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
25070 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  se(pMem);.    }.
25080 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25090 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  eNN(db, p);.  }.
250a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
250b0 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
250c0 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66  ATE_HOOK */..#if
250d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
250e0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
250f0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
25100 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
25110 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  k. If this is an
25120 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
25130 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c  E pre-update cal
25140 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f  l,.** then curso
25150 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
25160 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
25170 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
25180 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a  the row about.**
25190 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72   to be update or
251a0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65   deleted. If the
251b0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c   application cal
251c0 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  ls sqlite3_preup
251d0 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74  date_old(),.** t
251e0 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75  he required valu
251f0 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  e will be read f
25200 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20  rom the row the 
25210 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
25220 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25230 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f  3VdbePreUpdateHo
25240 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ok(.  Vdbe *v,  
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72        /* Vdbe pr
25270 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73  e-update hook is
25280 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20   invoked by */. 
25290 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73   VdbeCursor *pCs
252a0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
252b0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72   /* Cursor to gr
252c0 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20  ab old.* values 
252d0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  from */.  int op
252e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
252f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
25300 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41  ITE_INSERT, UPDA
25310 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a  TE or DELETE */.
25320 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
25330 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
25340 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
25350 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
25360 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
25370 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66          /* Modif
25380 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ied table */.  i
25390 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20  64 iKey1,       
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
253b0 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61  * Initial key va
253c0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  lue */.  int iRe
253d0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
253e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
253f0 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72  ster for new.* r
25400 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  ecord */.){.  sq
25410 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64  lite3 *db = v->d
25420 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a  b;.  i64 iKey2;.
25430 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75    PreUpdate preu
25440 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pdate;.  const c
25450 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62  har *zTbl = pTab
25460 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69  ->zName;.  stati
25470 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53  c const u8 fakeS
25480 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20  ortOrder = 0;.. 
25490 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72   assert( db->pPr
254a0 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20  eUpdate==0 );.  
254b0 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64 61 74  memset(&preupdat
254c0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65  e, 0, sizeof(Pre
254d0 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20  Update));.  if( 
254e0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d  HasRowid(pTab)==
254f0 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d  0 ){.    iKey1 =
25500 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20 20 20   iKey2 = 0;.    
25510 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20 3d 20  preupdate.pPk = 
25520 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
25530 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
25540 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6f  }else{.    if( o
25550 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
25560 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20   ){.      iKey2 
25570 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e  = v->aMem[iReg].
25580 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  u.i;.    }else{.
25590 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b        iKey2 = iK
255a0 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ey1;.    }.  }..
255b0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
255c0 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
255d0 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ol .       || (p
255e0 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
255f0 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d  b->nCol+1 && op=
25600 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26  =SQLITE_DELETE &
25610 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b  & iReg==-1).  );
25620 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20  ..  preupdate.v 
25630 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65  = v;.  preupdate
25640 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20  .pCsr = pCsr;.  
25650 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f  preupdate.op = o
25660 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  p;.  preupdate.i
25670 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  NewReg = iReg;. 
25680 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
25690 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72  fo.db = db;.  pr
256a0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
256b0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
256c0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
256d0 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 70  fo.nKeyField = p
256e0 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65  Tab->nCol;.  pre
256f0 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61  update.keyinfo.a
25700 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
25710 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b  )&fakeSortOrder;
25720 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
25730 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72  y1 = iKey1;.  pr
25740 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20  eupdate.iKey2 = 
25750 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61  iKey2;.  preupda
25760 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  te.pTab = pTab;.
25770 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
25780 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a  e = &preupdate;.
25790 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65    db->xPreUpdate
257a0 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72  Callback(db->pPr
257b0 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20  eUpdateArg, db, 
257c0 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69  op, zDb, zTbl, i
257d0 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20  Key1, iKey2);.  
257e0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d  db->pPreUpdate =
257f0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
25800 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74  ree(db, preupdat
25810 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64  e.aRecord);.  vd
25820 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64  beFreeUnpacked(d
25830 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  b, preupdate.key
25840 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31  info.nKeyField+1
25850 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70  , preupdate.pUnp
25860 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65 46 72  acked);.  vdbeFr
25870 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
25880 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
25890 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72  .nKeyField+1, pr
258a0 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61  eupdate.pNewUnpa
258b0 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65  cked);.  if( pre
258c0 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20  update.aNew ){. 
258d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
258e0 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
258f0 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
25900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
25910 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64  mRelease(&preupd
25920 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20  ate.aNew[i]);.  
25930 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
25940 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72 65 75  bFreeNN(db, preu
25950 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d  pdate.aNew);.  }
25960 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25970 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
25980 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a           DATE_HOOK */.