/ Hex Artifact Content
Login

Artifact 91f9e1fb59561fa7ba312b518b6123982c912d6c:


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 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33  beCreate(sqlite3
0320: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
0330: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  ;.  p = sqlite3D
0340: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
0350: 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a  sizeof(Vdbe) );.
0360: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0370: 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d  urn 0;.  p->db =
0380: 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70   db;.  if( db->p
0390: 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  Vdbe ){.    db->
03a0: 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70  pVdbe->pPrev = p
03b0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74  ;.  }.  p->pNext
03c0: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
03d0: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
03e0: 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20  db->pVdbe = p;. 
03f0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
0400: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
0410: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
0420: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53  * Remember the S
0430: 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20  QL string for a 
0440: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
0450: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
0460: 74 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64  te3VdbeSetSql(Vd
0470: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
0480: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  r *z, int n, int
0490: 20 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20   isPrepareV2){. 
04a0: 20 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61   assert( isPrepa
04b0: 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65  reV2==1 || isPre
04c0: 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69  pareV2==0 );.  i
04d0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
04e0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
04f0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0500: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0510: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
0520: 47 29 0a 20 20 69 66 28 20 21 69 73 50 72 65 70  G).  if( !isPrep
0530: 61 72 65 56 32 20 29 20 72 65 74 75 72 6e 3b 0a  areV2 ) return;.
0540: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
0550: 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20   p->zSql==0 );. 
0560: 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74   p->zSql = sqlit
0570: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
0580: 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 2d 3e 69  b, z, n);.  p->i
0590: 73 50 72 65 70 61 72 65 56 32 20 3d 20 28 75 38  sPrepareV2 = (u8
05a0: 29 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  )isPrepareV2;.}.
05b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
05c0: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
05d0: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
05e0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
05f0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0600: 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74  3_sql(sqlite3_st
0610: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 56 64  mt *pStmt){.  Vd
0620: 62 65 20 2a 70 20 3d 20 28 56 64 62 65 20 2a 29  be *p = (Vdbe *)
0630: 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  pStmt;.  return 
0640: 28 70 20 26 26 20 70 2d 3e 69 73 50 72 65 70 61  (p && p->isPrepa
0650: 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53 71 6c 20  reV2) ? p->zSql 
0660: 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77  : 0;.}../*.** Sw
0670: 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  ap all content b
0680: 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20  etween two VDBE 
0690: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
06a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
06b0: 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64  wap(Vdbe *pA, Vd
06c0: 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20  be *pB){.  Vdbe 
06d0: 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68  tmp, *pTmp;.  ch
06e0: 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74 6d 70 20  ar *zTmp;.  tmp 
06f0: 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a  = *pA;.  *pA = *
0700: 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b  pB;.  *pB = tmp;
0710: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e  .  pTmp = pA->pN
0720: 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74  ext;.  pA->pNext
0730: 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pB->pNext;.  
0740: 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70  pB->pNext = pTmp
0750: 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70  ;.  pTmp = pA->p
0760: 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65  Prev;.  pA->pPre
0770: 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20  v = pB->pPrev;. 
0780: 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d   pB->pPrev = pTm
0790: 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e  p;.  zTmp = pA->
07a0: 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c  zSql;.  pA->zSql
07b0: 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pB->zSql;.  p
07c0: 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a  B->zSql = zTmp;.
07d0: 20 20 70 42 2d 3e 69 73 50 72 65 70 61 72 65 56    pB->isPrepareV
07e0: 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 70 61 72  2 = pA->isPrepar
07f0: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0800: 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f  size the Vdbe.aO
0810: 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  p array so that 
0820: 69 74 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  it is at least o
0830: 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68 61  ne op larger tha
0840: 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a 2a  n .** it was..**
0850: 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66  .** If an out-of
0860: 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63  -memory error oc
0870: 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a  curs while resiz
0880: 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72  ing the array, r
0890: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
08a0: 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63  NOMEM. In this c
08b0: 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64  ase Vdbe.aOp and
08c0: 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72   Vdbe.nOpAlloc r
08d0: 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  emain .** unchan
08e0: 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20  ged (this is so 
08f0: 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73  that any opcodes
0900: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
0910: 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f  ed can be .** co
0920: 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61  rrectly dealloca
0930: 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
0940: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56  he rest of the V
0950: 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dbe)..*/.static 
0960: 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28  int growOpArray(
0970: 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64 62 65  Vdbe *p){.  Vdbe
0980: 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  Op *pNew;.  int 
0990: 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c  nNew = (p->nOpAl
09a0: 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc ? p->nOpAllo
09b0: 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34  c*2 : (int)(1024
09c0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20  /sizeof(Op)));. 
09d0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
09e0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
09f0: 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  p->aOp, nNew*siz
0a00: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
0a10: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  pNew ){.    p->n
0a20: 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65  OpAlloc = sqlite
0a30: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d  3DbMallocSize(p-
0a40: 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a 65 6f  >db, pNew)/sizeo
0a50: 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  f(Op);.    p->aO
0a60: 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  p = pNew;.  }.  
0a70: 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 53  return (pNew ? S
0a80: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
0a90: 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 23 69 66  E_NOMEM);.}..#if
0aa0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0ab0: 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ./* This routine
0ac0: 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65   is just a conve
0ad0: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
0ae0: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
0af0: 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72  that will.** fir
0b00: 65 20 61 66 74 65 72 20 65 61 63 68 20 6f 70 63  e after each opc
0b10: 6f 64 65 20 69 73 20 69 6e 73 65 72 74 65 64 20  ode is inserted 
0b20: 61 6e 64 20 64 69 73 70 6c 61 79 65 64 20 75 73  and displayed us
0b30: 69 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76  ing.** "PRAGMA v
0b40: 64 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f  dbe_addoptrace=o
0b50: 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  n"..*/.static vo
0b60: 69 64 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72  id test_addop_br
0b70: 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a  eakpoint(void){.
0b80: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d    static int n =
0b90: 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e   0;.  n++;.}.#en
0ba0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  dif../*.** Add a
0bb0: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
0bc0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
0bd0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72  instructions cur
0be0: 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56  rent in the.** V
0bf0: 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65  DBE.  Return the
0c00: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
0c10: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
0c20: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
0c30: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20  s:.**.**    p   
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e              Poin
0c50: 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a  ter to the VDBE.
0c60: 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20  **.**    op     
0c70: 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63           The opc
0c80: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73  ode for this ins
0c90: 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  truction.**.**  
0ca0: 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20    p1, p2, p3    
0cb0: 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a    Operands.**.**
0cc0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
0cd0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
0ce0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0cf0: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0d00: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0d10: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66  VdbeChangeP4() f
0d20: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0d30: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0d40: 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P4.** operand
0d50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d60: 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65 20  VdbeAddOp3(Vdbe 
0d70: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0d80: 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20  p1, int p2, int 
0d90: 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p3){.  int i;.  
0da0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
0db0: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73  i = p->nOp;.  as
0dc0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
0dd0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
0de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e  );.  assert( op>
0df0: 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a  0 && op<0xff );.
0e00: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0e10: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
0e20: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
0e30: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
0e40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
0e50: 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20  >nOp++;.  pOp = 
0e60: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
0e70: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29  p->opcode = (u8)
0e80: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20  op;.  pOp->p5 = 
0e90: 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70  0;.  pOp->p1 = p
0ea0: 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70  1;.  pOp->p2 = p
0eb0: 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70  2;.  pOp->p3 = p
0ec0: 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  3;.  pOp->p4.p =
0ed0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70   0;.  pOp->p4typ
0ee0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
0ef0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
0f00: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
0f10: 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f  MENTS.  pOp->zCo
0f20: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
0f30: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
0f40: 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64  DEBUG.  if( p->d
0f50: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0f60: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
0f70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
0f80: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
0f90: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
0fa0: 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65    test_addop_bre
0fb0: 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23  akpoint();.  }.#
0fc0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
0fd0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
0fe0: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
0ff0: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
1000: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1010: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1020: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
1030: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
1040: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1050: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1060: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1070: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1080: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1090: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
10a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
10c0: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
10d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
10e0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
10f0: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1100: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1110: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1120: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
1130: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1140: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1150: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1160: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
1170: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1180: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
1190: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11a0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
11b0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
11c0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
11d0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
11e0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
11f0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
1200: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
1210: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
1220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1230: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1240: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1250: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1260: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
1270: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
1280: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
1290: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
12a0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
12b0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
12c0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
12d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
12f0: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1300: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1310: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
1320: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
1330: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
1340: 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  an OP_ParseSchem
1350: 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  a opcode.  This 
1360: 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65  routine is broke
1370: 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71  n out from.** sq
1380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1390: 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73  ) since it needs
13a0: 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74   to also needs t
13b0: 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65  o mark all btree
13c0: 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62  s.** as having b
13d0: 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  een used..**.** 
13e0: 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e  The zWhere strin
13f0: 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
1400: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1410: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
1420: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1430: 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72   will take owner
1440: 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ship of the allo
1450: 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  cated memory..*/
1460: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1470: 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
1480: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  p(Vdbe *p, int i
1490: 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65  Db, char *zWhere
14a0: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e  ){.  int j;.  in
14b0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
14c0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50  VdbeAddOp3(p, OP
14d0: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
14e0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  b, 0, 0);.  sqli
14f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1500: 70 2c 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c  p, addr, zWhere,
1510: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1520: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62  for(j=0; j<p->db
1530: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69  ->nDb; j++) sqli
1540: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
1550: 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, j);.}../*.**
1560: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
1570: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
1580: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20   p4 value as an 
1590: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
15a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15b0: 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  4Int(.  Vdbe *p,
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15d0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
15e0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
15f0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1600: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1610: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1630: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1640: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1650: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1660: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1670: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1680: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1690: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
16c0: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  as an integer */
16d0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
16e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1700: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1710: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1720: 61 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54  addr, SQLITE_INT
1730: 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f  _TO_PTR(p4), P4_
1740: 49 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e  INT32);.  return
1750: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1760: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
1770: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
1780: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1790: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
17a0: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
17b0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
17c0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
17d0: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
17e0: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
17f0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
1800: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
1810: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
1820: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
1830: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
1840: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
1850: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
1860: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
1870: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
1880: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
1890: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
18a0: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
18b0: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
18c0: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
18d0: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
18e0: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
18f0: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
1900: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
1910: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
1920: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
1930: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
1940: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
1950: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
1960: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
1970: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
1980: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
1990: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
19a0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
19b0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
19c0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
19d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
19e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
19f0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 20 3d  e *p){.  int i =
1a00: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
1a10: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1a20: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1a30: 54 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20  T );.  if( (i & 
1a40: 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (i-1))==0 ){.   
1a50: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
1a60: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1a70: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
1a80: 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  abel, .         
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
1ab0: 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  *2+1)*sizeof(p->
1ac0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d  aLabel[0]));.  }
1ad0: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
1ae0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
1af0: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
1b00: 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a   return -1-i;.}.
1b10: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
1b20: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
1b30: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1b40: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1b50: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
1b60: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
1b70: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
1b80: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1b90: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
1ba0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1bb0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
1bc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1bd0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1be0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29  (Vdbe *p, int x)
1bf0: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78  {.  int j = -1-x
1c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1c10: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1c20: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1c30: 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  t( j<p->nLabel )
1c40: 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 26 26 20  ;.  if( j>=0 && 
1c50: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1c60: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
1c70: 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->nOp;.  }.}../
1c80: 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44  *.** Mark the VD
1c90: 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63  BE as one that c
1ca0: 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f  an only be run o
1cb0: 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  ne time..*/.void
1cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f   sqlite3VdbeRunO
1cd0: 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29  nlyOnce(Vdbe *p)
1ce0: 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  {.  p->runOnlyOn
1cf0: 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65  ce = 1;.}..#ifde
1d00: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f  f SQLITE_DEBUG /
1d10: 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  * sqlite3AssertM
1d20: 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20  ayAbort() logic 
1d30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  */../*.** The fo
1d40: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64  llowing type and
1d50: 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73   function are us
1d60: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1d70: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
1d80: 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d  s.** in a Vdbe m
1d90: 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20  ain program and 
1da0: 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d  each of the sub-
1db0: 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65  programs (trigge
1dc0: 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69  rs) it may .** i
1dd0: 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f  nvoke directly o
1de0: 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74  r indirectly. It
1df0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1e00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e10: 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20  *   Op *pOp;.** 
1e20: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74    VdbeOpIter sIt
1e30: 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73  er;.**.**   mems
1e40: 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69  et(&sIter, 0, si
1e50: 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a  zeof(sIter));.**
1e60: 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20     sIter.v = v; 
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20             // v 
1e90: 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a  is of type Vdbe*
1ea0: 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70   .**   while( (p
1eb0: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
1ec0: 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20  &sIter)) ){.**  
1ed0: 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69     // Do somethi
1ee0: 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20  ng with pOp.**  
1ef0: 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44   }.**   sqlite3D
1f00: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
1f10: 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a  er.apSub);.** .*
1f20: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1f30: 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65   VdbeOpIter Vdbe
1f40: 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56  OpIter;.struct V
1f50: 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64  dbeOpIter {.  Vd
1f60: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
1f80: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1f90: 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20  ugh the opcodes 
1fa0: 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  of */.  SubProgr
1fb0: 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20  am **apSub;     
1fc0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
1fd0: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
1fe0: 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20  int nSub;       
1ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2000: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2010: 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e  in apSub */.  in
2020: 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20  t iAddr;        
2030: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
2040: 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74  ess of next inst
2050: 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72  ruction to retur
2060: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b  n */.  int iSub;
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72    /* 0 = main pr
2090: 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74  ogram, 1 = first
20a0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63   sub-program etc
20b0: 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f  . */.};.static O
20c0: 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64  p *opIterNext(Vd
20d0: 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20  beOpIter *p){.  
20e0: 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a  Vdbe *v = p->v;.
20f0: 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a    Op *pRet = 0;.
2100: 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74    Op *aOp;.  int
2110: 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   nOp;..  if( p->
2120: 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b  iSub<=p->nSub ){
2130: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75  ..    if( p->iSu
2140: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f  b==0 ){.      aO
2150: 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20  p = v->aOp;.    
2160: 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a    nOp = v->nOp;.
2170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2180: 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   aOp = p->apSub[
2190: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b  p->iSub-1]->aOp;
21a0: 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e  .      nOp = p->
21b0: 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d  apSub[p->iSub-1]
21c0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
21d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64   assert( p->iAdd
21e0: 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52  r<nOp );..    pR
21f0: 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64  et = &aOp[p->iAd
2200: 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64  dr];.    p->iAdd
2210: 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r++;.    if( p->
2220: 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20  iAddr==nOp ){.  
2230: 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20      p->iSub++;. 
2240: 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20       p->iAddr = 
2250: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
2260: 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65  if( pRet->p4type
2270: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
2280: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
2290: 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29  te = (p->nSub+1)
22a0: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
22b0: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  am*);.      int 
22c0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
22d0: 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b  ; j<p->nSub; j++
22e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22f0: 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74  ->apSub[j]==pRet
2300: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
2310: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2320: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
2330: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Sub ){.        p
2340: 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65  ->apSub = sqlite
2350: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
2360: 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62  (v->db, p->apSub
2370: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2380: 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20    if( !p->apSub 
2390: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  ){.          pRe
23a0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
23b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23c0: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62  p->apSub[p->nSub
23d0: 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70  ++] = pRet->p4.p
23e0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
23f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2400: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2410: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Ret;.}../*.** Ch
2420: 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72  eck if the progr
2430: 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  am stored in the
2440: 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77   VM associated w
2450: 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a  ith pParse may.*
2460: 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54  * throw an ABORT
2470: 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73   exception (caus
2480: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
2490: 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72  t, but not entir
24a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
24b0: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
24c0: 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74  ck). This condit
24d0: 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
24e0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
24f0: 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72  or any.** sub-pr
2500: 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20  ograms contains 
2510: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
2520: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  wing:.**.**   * 
2530: 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31   OP_Halt with P1
2540: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2550: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2560: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  rt..**   *  OP_H
2570: 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50  altIfNull with P
2580: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2590: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
25a0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
25b0: 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20  Destroy.**   *  
25c0: 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20  OP_VUpdate.**   
25d0: 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a  *  OP_VRename.**
25e0: 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74     *  OP_FkCount
25f0: 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69  er with P2==0 (i
2600: 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
2610: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29   key constraint)
2620: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
2630: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
2640: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
2650: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
2660: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
2670: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
2680: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
2690: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
26a0: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
26b0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
26c0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
26d0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
26e0: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
26f0: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
2700: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
2710: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
2720: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
2730: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
2740: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
2750: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
2760: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
2770: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
2780: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
2790: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
27a0: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
27b0: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
27c0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64  .  Op *pOp;.  Vd
27d0: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
27e0: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
27f0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
2800: 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20  ));.  sIter.v = 
2810: 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f  v;..  while( (pO
2820: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2830: 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20  sIter))!=0 ){.  
2840: 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70    int opcode = p
2850: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
2860: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
2870: 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65  estroy || opcode
2880: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20  ==OP_VUpdate || 
2890: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61  opcode==OP_VRena
28a0: 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  me .#ifndef SQLI
28b0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
28c0: 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63  KEY.     || (opc
28d0: 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65  ode==OP_FkCounte
28e0: 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20  r && pOp->p1==0 
28f0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a  && pOp->p2==1) .
2900: 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28  #endif.     || (
2910: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
2920: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
2930: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
2940: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
2950: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
2960: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
2970: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
2980: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
2990: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
29a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
29b0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
29c0: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
29d0: 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75  Sub);..  /* Retu
29e0: 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62  rn true if hasAb
29f0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f  ort==mayAbort. O
2a00: 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  r if a malloc fa
2a10: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
2a20: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66    ** If malloc f
2a30: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ailed, then the 
2a40: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f  while() loop abo
2a50: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ve may not have 
2a60: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68  iterated.  ** th
2a70: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
2a80: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d  s and hasAbort m
2a90: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  ay be set incorr
2aa0: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20  ectly. Return.  
2ab0: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73  ** true for this
2ac0: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74   case to prevent
2ad0: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e   the assert() in
2ae0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61   the callers fra
2af0: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69  me.  ** from fai
2b00: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75  ling.  */.  retu
2b10: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c  rn ( v->db->mall
2b20: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41  ocFailed || hasA
2b30: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29  bort==mayAbort )
2b40: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2b50: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
2b60: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2b70: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
2b80: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
2b90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
2ba0: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
2bb0: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
2bc0: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
2bd0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
2be0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
2bf0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
2c00: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
2c10: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
2c20: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
2c30: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
2c40: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
2c50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2c60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
2c70: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
2c80: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
2c90: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
2ca0: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
2cb0: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
2cc0: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
2cd0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
2ce0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
2cf0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
2d00: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
2d10: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
2d20: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
2d30: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
2d40: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
2d50: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
2d60: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
2d70: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
2d80: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
2d90: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
2da0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
2db0: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
2dc0: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
2dd0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
2de0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
2df0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
2e00: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a  Op *pOp;.  int *
2e10: 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62  aLabel = p->aLab
2e20: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
2e30: 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52  y = 1;.  p->bIsR
2e40: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72  eader = 0;.  for
2e50: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2e60: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2e70: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2e80: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
2e90: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a  >opcode;..    /*
2ea0: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
2eb0: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
2ec0: 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64 69  eh.awk when addi
2ed0: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
2ee0: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
2ef0: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
2f00: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63  .    switch( opc
2f10: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
2f20: 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a 20  e OP_Function:. 
2f30: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67 67       case OP_Agg
2f40: 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20 20  Step: {.        
2f50: 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78  if( pOp->p5>nMax
2f60: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
2f70: 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 20  = pOp->p5;.     
2f80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2f90: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
2fa0: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
2fb0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
2fc0: 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f  p2!=0 ) p->readO
2fd0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
2fe0: 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f   /* fall thru */
2ff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3000: 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  ase OP_AutoCommi
3010: 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  t:.      case OP
3020: 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20  _Savepoint: {.  
3030: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
3040: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
3050: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
3060: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3070: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61 73  IT_WAL.      cas
3080: 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
3090: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
30a0: 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20  se OP_Vacuum:.  
30b0: 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72      case OP_Jour
30c0: 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20  nalMode: {.     
30d0: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
30e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62   0;.        p->b
30f0: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
3100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3110: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
3120: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
3130: 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73 65  TABLE.      case
3140: 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20   OP_VUpdate: {. 
3150: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
3160: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
3170: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
3180: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
31a0: 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20  ase OP_VFilter: 
31b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
31c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31d0: 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33   p->nOp - i >= 3
31e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
31f0: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
3200: 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29  de==OP_Integer )
3210: 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f  ;.        n = pO
3220: 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20  p[-1].p1;.      
3230: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
3240: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
3250: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3260: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
3270: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
3280: 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  t:.      case OP
3290: 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20  _SorterNext: {. 
32a0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78         pOp->p4.x
32b0: 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65  Advance = sqlite
32c0: 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20  3BtreeNext;.    
32d0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
32e0: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
32f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3300: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3310: 4f 50 5f 50 72 65 76 3a 20 7b 0a 20 20 20 20 20  OP_Prev: {.     
3320: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
3330: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
3340: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
3350: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3360: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
3370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3380: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3390: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73  pOp->opflags = s
33a0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
33b0: 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20  erty[opcode];.  
33c0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
33d0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  ags & OPFLG_JUMP
33e0: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  )!=0 && pOp->p2<
33f0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
3400: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d  t( -1-pOp->p2<p-
3410: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
3420: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
3430: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3440: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3450: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
3460: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d  p->aLabel);.  p-
3470: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >aLabel = 0;.  *
3480: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
3490: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
34a0: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
34b0: 3d 30 20 7c 7c 20 70 2d 3e 62 74 72 65 65 4d 61  =0 || p->btreeMa
34c0: 73 6b 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  sk==0 );.}../*.*
34d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
34e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
34f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3500: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3510: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3520: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3530: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3540: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3550: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
3560: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
3570: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3580: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
3590: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
35a0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
35b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
35c0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
35d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
35e0: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
35f0: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3600: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3610: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3620: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3630: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3640: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
3650: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
3660: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
3670: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3680: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
3690: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
36a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
36b0: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
36c0: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
36d0: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
36e0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
36f0: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3700: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3710: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3720: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3730: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3740: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
3750: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
3760: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
3770: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
3780: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
3790: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
37a0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
37b0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
37c0: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
37d0: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
37e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
37f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3800: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3810: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3820: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3830: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3840: 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a  btreeMask==0 );.
3850: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
3860: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
3870: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
3880: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
3890: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
38a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
38b0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
38c0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
38d0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
38e0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
38f0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
3900: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
3910: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3920: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
3930: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
3940: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
3950: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
3960: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
3970: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3980: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
3990: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
39a0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
39b0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20   growOpArray(p) 
39c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
39d0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
39e0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41  >nOp;.  if( ALWA
39f0: 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20  YS(nOp>0) ){.   
3a00: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
3a10: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
3a20: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
3a30: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
3a40: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
3a50: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
3a60: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
3a70: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
3a80: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
3a90: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
3aa0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
3ab0: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
3ac0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
3ad0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  <0 ){.        as
3ae0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 70 63  sert( sqlite3Opc
3af0: 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74  odeProperty[pOut
3b00: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
3b10: 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20 20 20  G_JUMP );.      
3b20: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
3b30: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3b50: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3b70: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3b80: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
3b90: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3ba0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
3bb0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
3bc0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
3bd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3be0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
3bf0: 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75 74 2d  ENTS.      pOut-
3c00: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23  >zComment = 0;.#
3c10: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3c20: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
3c30: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
3c40: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
3c50: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
3c60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
3c70: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
3c80: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
3c90: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
3ca0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
3cb0: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
3cc0: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
3cd0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3ce0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3cf0: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
3d00: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3d10: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3d20: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
3d30: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
3d40: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
3d50: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
3d60: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
3d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3d80: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3d90: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3da0: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
3db0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
3dc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3dd0: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
3de0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3df0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3e00: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3e10: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3e20: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3e30: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
3e40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3e50: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3e60: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
3e70: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3e80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3e90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3ea0: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
3eb0: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
3ec0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3ed0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3ee0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3ef0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3f00: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3f10: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3f20: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3f30: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3f40: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3f50: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3f60: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3f70: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3f80: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3f90: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3fa0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3fb0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
3fc0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3fd0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3fe0: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
3ff0: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
4000: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20  >aOp[addr].p3 = 
4010: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4020: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4030: 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65  ue of the P5 ope
4040: 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73  rand for the mos
4050: 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64  t recently.** ad
4060: 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ded operation..*
4070: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4080: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
4090: 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61  *p, u8 val){.  a
40a0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
40b0: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
40c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
40d0: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
40e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
40f0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
4100: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
4110: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
4120: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
4130: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
4140: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
4150: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
4160: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
4170: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
4180: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4190: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
41a0: 64 64 72 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  ddr){.  if( ALWA
41b0: 59 53 28 61 64 64 72 3e 3d 30 29 20 29 20 73 71  YS(addr>=0) ) sq
41c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
41d0: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
41e0: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
41f0: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
4200: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
4210: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
4220: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
4230: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
4240: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
4250: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
4260: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
4270: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
4280: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
4290: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
42a0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65    if( ALWAYS(pDe
42b0: 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 75 6e  f) && (pDef->fun
42c0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
42d0: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
42e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
42f0: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
4300: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
4310: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
4320: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
4330: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4340: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
4350: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
4360: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4370: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
4380: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
4390: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
43a0: 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p4 ){.    assert
43b0: 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74  ( db );.    swit
43c0: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
43d0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
43e0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
43f0: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
4400: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
4410: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4420: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20  RRAY: {.        
4430: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4440: 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  , p4);.        b
4450: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4460: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
4470: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  NFO: {.        i
4480: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
4490: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
44a0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65  KeyInfoUnref((Ke
44b0: 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20  yInfo*)p4);.    
44c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
44d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
44e0: 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20  _MPRINTF: {.    
44f0: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
4500: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
4510: 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a  lite3_free(p4);.
4520: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4540: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
4550: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
4560: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
4570: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
4580: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
45a0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
45b0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
45c0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
45d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
45e0: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
45f0: 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a  te3_value*)p4);.
4600: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4610: 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20           Mem *p 
4620: 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20  = (Mem*)p4;.    
4630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4640: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
4650: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  oc);.          s
4660: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4670: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
4680: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4690: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
46a0: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
46b0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
46c0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
46d0: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
46e0: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
46f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4700: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
4720: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
4730: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
4740: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
4750: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
4760: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
4770: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
4780: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
4790: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
47a0: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
47b0: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
47c0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
47d0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
47e0: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
47f0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
4800: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
4810: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
4820: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
4830: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
4840: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
4850: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
4860: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
4870: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
4880: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
4890: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
48a0: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
48b0: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
48c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
48d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
48e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
48f0: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
4900: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
4910: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
4920: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
4930: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
4940: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
4950: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
4960: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
4970: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
4980: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
4990: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
49a0: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
49b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
49c0: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
49d0: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
49e0: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
49f0: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
4a00: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
4a10: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
4a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4a30: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
4a40: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
4a50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4a60: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
4a70: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4a80: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70  r){.  if( p->aOp
4a90: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
4aa0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
4ab0: 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr];.    sqlite3
4ac0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
4ad0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
4ae0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
4af0: 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  4.p);.    memset
4b00: 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pOp, 0, sizeof(
4b10: 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f  pOp[0]));.    pO
4b20: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
4b30: 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61 64 64  oop;.    if( add
4b40: 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20 29 20 70 2d  r==p->nOp-1 ) p-
4b50: 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >nOp--;.  }.}../
4b60: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
4b70: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
4b80: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
4b90: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
4ba0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
4bb0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
4bc0: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
4bd0: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
4be0: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
4bf0: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
4c00: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
4c10: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
4c20: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
4c30: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
4c40: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
4c50: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
4c60: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
4c70: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
4c80: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
4c90: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
4ca0: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
4cb0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
4cc0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
4cd0: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
4ce0: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
4cf0: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
4d00: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
4d10: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
4d20: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
4d30: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
4d40: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a  tes of zP4..** .
4d50: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
4d60: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
4d70: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
4d80: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
4d90: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
4da0: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
4db0: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
4dc0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
4dd0: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
4de0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
4df0: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
4e00: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
4e10: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
4e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
4e30: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
4e40: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
4e50: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
4e60: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
4e70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4e80: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
4e90: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
4ea0: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
4eb0: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
4ec0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
4ed0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4ee0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
4ef0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4f00: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4f10: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
4f20: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
4f30: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
4f40: 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b  f( n!=P4_VTAB ){
4f50: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4f60: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
4f70: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
4f80: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
4f90: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
4fa0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
4fb0: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
4fc0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
4fd0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
4fe0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
4ff0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
5000: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ];.  assert( pOp
5010: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
5020: 55 53 45 44 20 7c 7c 20 70 4f 70 2d 3e 70 34 74  USED || pOp->p4t
5030: 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b  ype==P4_INT32 );
5040: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
5050: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
5060: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
5070: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
5080: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
5090: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
50a0: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
50b0: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
50c0: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
50d0: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
50e0: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
50f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
5100: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
5110: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
5120: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
5130: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5140: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
5150: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
5160: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
5170: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5180: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
5190: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
51a0: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
51b0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
51c0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
51d0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
51e0: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
51f0: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
5200: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5210: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5220: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5230: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
5240: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
5250: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
5260: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
5270: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
5280: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5290: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
52a0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
52b0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
52c0: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
52d0: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
52e0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
52f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
5300: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
5310: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
5320: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
5330: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
5340: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
5350: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  AMIC;.  }.}../*.
5360: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
5370: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5380: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
5390: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
53a0: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
53b0: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
53c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
53d0: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
53e0: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
53f0: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
5400: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5410: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
5420: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
5430: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
5440: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
5450: 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  1, (char*)sqlite
5460: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
5470: 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20  pParse, pIdx),. 
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
54a0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
54b0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
54c0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a  N_COMMENTS./*.**
54d0: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
54e0: 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  ent on the most 
54f0: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
5500: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a  nstruction.  Or.
5510: 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f  ** insert a No-o
5520: 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f  p and add the co
5530: 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65  mment to that ne
5540: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  w instruction.  
5550: 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68  This.** makes th
5560: 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f  e code easier to
5570: 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62   read during deb
5580: 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66  ugging.  None of
5590: 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a   this happens.**
55a0: 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   in a production
55b0: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
55c0: 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d  c void vdbeVComm
55d0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
55e0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
55f0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
5600: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5610: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
5620: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
5630: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
5640: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
5650: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
5660: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
5670: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
5680: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
5690: 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Op );.    sqlite
56a0: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
56b0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
56c0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70  zComment);.    p
56d0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
56e0: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74  zComment = sqlit
56f0: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
5700: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5710: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
5720: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
5730: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
5740: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5750: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5760: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76    if( p ){.    v
5770: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5780: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
5790: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
57a0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
57b0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
57c0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
57d0: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
57e0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
57f0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5800: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5810: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
5820: 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20  e3VdbeAddOp0(p, 
5830: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61  OP_Noop);.    va
5840: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
5850: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
5860: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
5870: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
5880: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
5890: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
58a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
58b0: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
58c0: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20   given address. 
58d0: 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20   If the address 
58e0: 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72  is -1, then.** r
58f0: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
5900: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
5910: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
5920: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
5930: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
5940: 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74  occurred prior t
5950: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66  o the calling of
5960: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
5970: 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
5980: 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65   to a dummy Vdbe
5990: 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  Op will be retur
59a0: 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64  ned.  That opcod
59b0: 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65  e.** is readable
59c0: 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c   but not writabl
59d0: 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  e, though it is 
59e0: 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62  cast to a writab
59f0: 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  le value..** The
5a00: 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d   return of a dum
5a10: 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73  my opcode allows
5a20: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e   the call to con
5a30: 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e  tinue functionin
5a40: 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d  g.** after a OOM
5a50: 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68   fault without h
5a60: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
5a70: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
5a80: 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69  urn from .** thi
5a90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
5aa0: 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42  alid pointer.  B
5ab0: 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ut because the d
5ac0: 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30  ummy.opcode is 0
5ad0: 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20  ,.** dummy will 
5ae0: 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e  never be written
5af0: 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65   to.  This is ve
5b00: 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69  rified by code i
5b10: 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  nspection and.**
5b20: 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68   by running with
5b30: 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a   Valgrind..**.**
5b40: 20 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65   About the #ifde
5b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5b60: 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ACE:  Normally, 
5b70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5b80: 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20  never called.** 
5b90: 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e  unless p->nOp>0.
5ba0: 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73    This is becaus
5bb0: 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65  e in the absense
5bc0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   of SQLITE_OMIT_
5bd0: 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f  TRACE,.** an OP_
5be0: 54 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f  Trace instructio
5bf0: 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65  n is always inse
5c00: 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  rted by sqlite3V
5c10: 64 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e  dbeGet() as soon
5c20: 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42   as.** a new VDB
5c30: 45 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53  E is created.  S
5c40: 6f 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f  o we are free to
5c50: 20 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e   set addr to p->
5c60: 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a  nOp-1 without.**
5c70: 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c   having to doubl
5c80: 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  e-check to make 
5c90: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
5ca0: 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  sult is non-nega
5cb0: 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20  tive. But.** if 
5cc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
5cd0: 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68  E is defined, th
5ce0: 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d  e OP_Trace is om
5cf0: 69 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20  itted and we do 
5d00: 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b  need to.** check
5d10: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d   the value of p-
5d20: 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f  >nOp-1 before co
5d30: 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62  ntinuing..*/.Vdb
5d40: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
5d50: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
5d60: 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43  nt addr){.  /* C
5d70: 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61  89 specifies tha
5d80: 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22  t the constant "
5d90: 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69  dummy" will be i
5da0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
5db0: 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68  l.  ** zeros, wh
5dc0: 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20  ich is correct. 
5dd0: 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20   MSVC generates 
5de0: 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72  a warning, never
5df0: 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74  theless. */.  st
5e00: 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d  atic VdbeOp dumm
5e10: 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  y;  /* Ignore th
5e20: 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61  e MSVC warning a
5e30: 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69  bout no initiali
5e40: 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  zer */.  assert(
5e50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
5e60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
5e70: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23 69  if( addr<0 ){.#i
5e80: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5e90: 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 70  _TRACE.    if( p
5ea0: 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75 72  ->nOp==0 ) retur
5eb0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
5ec0: 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64  y;.#endif.    ad
5ed0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5ee0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
5ef0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
5f00: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
5f10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5f20: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
5f30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
5f40: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
5f50: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
5f60: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
5f70: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
5f80: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
5f90: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
5fa0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
5fb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
5fc0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
5fd0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
5fe0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
5ff0: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
6000: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
6010: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
6020: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
6030: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
6040: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
6050: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
6060: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
6070: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
6080: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
6090: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
60a0: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
60b0: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
60c0: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
60d0: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
60e0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
60f0: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
6100: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
6110: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
6120: 74 69 6e 67 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ting.*/.static i
6130: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
6140: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
6150: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
6160: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
6170: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
6180: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
6190: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
61a0: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
61b0: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
61c0: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
61d0: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
61e0: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
61f0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
6200: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
6210: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
6220: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
6230: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6240: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
6250: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
6260: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
6270: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
6280: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
6290: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
62a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
62b0: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
62c0: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
62d0: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
62e0: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
62f0: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
6300: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
6310: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
6320: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
6330: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
6340: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
6350: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
6360: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
6370: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
6380: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
6390: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
63a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
63b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
63c0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
63d0: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
63e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
63f0: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
6400: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6410: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
6420: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
6430: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
6440: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
6450: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
6460: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6470: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
6480: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
6490: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
64a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
64b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
64c0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
64d0: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
64e0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
64f0: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
6500: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
6510: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
6520: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
6530: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
6540: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
6550: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
6560: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
6570: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
6580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6590: 20 76 32 3e 31 20 29 20 73 71 6c 69 74 65 33 5f   v2>1 ) sqlite3_
65a0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
65b0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e  j, zTemp+jj, "..
65c0: 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20  %d", v1+v2-1);. 
65d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
65e0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
65f0: 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33  psis+ii+1, "..P3
6600: 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d  ", 4)==0 && pOp-
6610: 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p3==0 ){.      
6620: 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20        ii += 4;. 
6630: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6640: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20     }.        jj 
6650: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
6660: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
6670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6680: 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d     zTemp[jj++] =
6690: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   c;.      }.    
66a0: 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43  }.    if( !seenC
66b0: 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35  om && jj<nTemp-5
66c0: 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e   && pOp->zCommen
66d0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
66e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
66f0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
6700: 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  "; %s", pOp->zCo
6710: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a  mment);.      jj
6720: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
6730: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
6740: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c     }.    if( jj<
6750: 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a  nTemp ) zTemp[jj
6760: 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  ] = 0;.  }else i
6770: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
6780: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6790: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
67a0: 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70  zTemp, "%s", pOp
67b0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
67c0: 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72   jj = sqlite3Str
67d0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
67e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70  }else{.    zTemp
67f0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20  [0] = 0;.    jj 
6800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
6810: 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n jj;.}.#endif /
6820: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
6830: 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  /...#if !defined
6840: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
6850: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
6860: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
6870: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
6880: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
6890: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
68a0: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
68b0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
68c0: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
68d0: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
68e0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
68f0: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
6900: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
6910: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
6920: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
6930: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
6940: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
6950: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
6960: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
6970: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
6980: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
6990: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
69a0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
69b0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
69c0: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
69d0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
69e0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
69f0: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
6a00: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
6a10: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
6a20: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6a30: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6a40: 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66   "k(%d", pKeyInf
6a50: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
6a60: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72    i = sqlite3Str
6a70: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
6a80: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6a90: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
6aa0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
6ab0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
6ac0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
6ad0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  j];.        cons
6ae0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
6af0: 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  pColl ? pColl->z
6b00: 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20  Name : "nil";.  
6b10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
6b20: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
6b30: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
6b40: 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70  ( n==6 && memcmp
6b50: 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c  (zColl,"BINARY",
6b60: 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
6b70: 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a     zColl = "B";.
6b80: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b            n = 1;
6b90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6ba0: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
6bb0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
6bc0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
6bd0: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
6be0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
6c00: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
6c10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
6c20: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
6c30: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
6c40: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6c50: 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -';.        }.  
6c60: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
6c70: 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e  emp[i], zColl, n
6c80: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  +1);.        i +
6c90: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
6ca0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6cb0: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
6cc0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
6cd0: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
6ce0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6cf0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6d00: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
6d10: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6d20: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
6d30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6d40: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6d50: 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 73 29 22  zTemp, "(%.20s)"
6d60: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
6d70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6d80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6d90: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
6da0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
6db0: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
6dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6dd0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6de0: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
6df0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
6e00: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
6e10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6e20: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
6e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6e40: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6e50: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  Temp, "%lld", *p
6e60: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
6e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6e80: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6e90: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
6ea0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6eb0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
6ec0: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
6ed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6ee0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
6ef0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6f00: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6f10: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
6f20: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  , *pOp->p4.pReal
6f30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6f40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6f50: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  4_MEM: {.      M
6f60: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e  em *pMem = pOp->
6f70: 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  p4.pMem;.      i
6f80: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
6f90: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
6fa0: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
6fb0: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
6fc0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
6fd0: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6ff0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7000: 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  p, "%lld", pMem-
7010: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
7020: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
7030: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
7040: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7050: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7060: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
7070: 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20   pMem->r);.     
7080: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
7090: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
70a0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
70b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
70c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c  emp, zTemp, "NUL
70d0: 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  L");.      }else
70e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
70f0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
7100: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
7110: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62      zP4 = "(blob
7120: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )";.      }.    
7130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7140: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7150: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
7160: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
7170: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7180: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
7190: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
71a0: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
71b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
71c0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
71d0: 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20  :%p:%p", pVtab, 
71e0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b  pVtab->pModule);
71f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7200: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
7210: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
7220: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7230: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7240: 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61   zTemp, "intarra
7250: 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  y");.      break
7260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7270: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20   P4_SUBPROGRAM: 
7280: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7290: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
72a0: 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22  zTemp, "program"
72b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
72c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
72d0: 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20  4_ADVANCE: {.   
72e0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
72f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7300: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
7310: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
7320: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
7330: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
7340: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
7350: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
7360: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
7370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
7380: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
7390: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
73a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  endif../*.** Dec
73b0: 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65  lare to the Vdbe
73c0: 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20   that the BTree 
73d0: 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44  object at db->aD
73e0: 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a  b[i] is used..**
73f0: 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64  .** The prepared
7400: 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64   statements need
7410: 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61   to know in adva
7420: 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  nce the complete
7430: 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63   set of.** attac
7440: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68  hed databases th
7450: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20  at will be use. 
7460: 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65   A mask of these
7470: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73   databases.** is
7480: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70   maintained in p
7490: 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68  ->btreeMask.  Th
74a0: 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61  e p->lockMask va
74b0: 6c 75 65 20 69 73 20 74 68 65 20 73 75 62 73 65  lue is the subse
74c0: 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65  t of.** p->btree
74d0: 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  Mask of database
74e0: 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  s that will requ
74f0: 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76  ire a lock..*/.v
7500: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
7510: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
7520: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
7530: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
7540: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69  >db->nDb && i<(i
7550: 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73  nt)sizeof(yDbMas
7560: 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74  k)*8 );.  assert
7570: 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( i<(int)sizeof(
7580: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
7590: 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  );.  p->btreeMas
75a0: 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31  k |= ((yDbMask)1
75b0: 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31  )<<i;.  if( i!=1
75c0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
75d0: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
75e0: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
75f0: 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c     p->lockMask |
7600: 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c  = ((yDbMask)1)<<
7610: 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  i;.  }.}..#if !d
7620: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7630: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
7640: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
7650: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  DSAFE>0./*.** If
7660: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
7670: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
7680: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
7690: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
76a0: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
76b0: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
76c0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
76d0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
76e0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
76f0: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
7700: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
7710: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
7720: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
7730: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
7740: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
7750: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
7760: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
7770: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
7780: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
7790: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
77a0: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
77b0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
77c0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
77d0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
77e0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
77f0: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
7800: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
7810: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
7820: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
7830: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
7840: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
7850: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
7860: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
7870: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
7880: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
7890: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
78a0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
78b0: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
78c0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
78d0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
78e0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
78f0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
7900: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
7910: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
7920: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
7930: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
7940: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
7950: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
7960: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
7970: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
7980: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
7990: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
79a0: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
79b0: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
79c0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
79d0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
79e0: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
79f0: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
7a00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7a10: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
7a20: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
7a30: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
7a40: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
7a50: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
7a60: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
7a70: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7a80: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
7a90: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
7aa0: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
7ab0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70  int nDb;.  if( p
7ac0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20  ->lockMask==0 ) 
7ad0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
7ae0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
7af0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7b00: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
7b10: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
7b20: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
7b30: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61  ; i<nDb; i++, ma
7b40: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20  sk += mask){.   
7b50: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61   if( i!=1 && (ma
7b60: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  sk & p->lockMask
7b70: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61  )!=0 && ALWAYS(a
7b80: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
7b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7ba0: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
7bb0: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
7bc0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
7bd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7be0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
7bf0: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
7c00: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
7c10: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
7c20: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
7c30: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
7c40: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
7c50: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69  eEnter()..*/.voi
7c60: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
7c70: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
7c80: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
7c90: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7ca0: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
7cb0: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
7cc0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
7cd0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
7ce0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
7cf0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
7d00: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
7d10: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
7d20: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
7d30: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
7d40: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
7d50: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
7d60: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
7d70: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
7d80: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
7d90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7da0: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
7db0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
7dc0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
7dd0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
7de0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
7df0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
7e00: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
7e10: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
7e20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
7e30: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
7e40: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
7e50: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
7e60: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
7e70: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
7e80: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
7e90: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63  ar zPtr[50];.  c
7ea0: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20  har zCom[100];. 
7eb0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7ec0: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
7ed0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
7ee0: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58  d %4d %-13s %.2X
7ef0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
7f00: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
7f10: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
7f20: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
7f30: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
7f40: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
7f50: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
7f60: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c  COMMENTS.  displ
7f70: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
7f80: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66  P4, zCom, sizeof
7f90: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20  (zCom));.#else. 
7fa0: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 0a 23 65 6e   zCom[0] = 0.#en
7fb0: 64 69 66 0a 20 20 66 70 72 69 6e 74 66 28 70 4f  dif.  fprintf(pO
7fc0: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
7fd0: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
7fe0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
7ff0: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
8000: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
8010: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
8020: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
8030: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
8040: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
8050: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
8060: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
8070: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
8080: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
8090: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
80a0: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  N){.  if( p && N
80b0: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e   ){.    Mem *pEn
80c0: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  d;.    sqlite3 *
80d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
80e0: 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  u8 malloc_failed
80f0: 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
8100: 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  led;.    if( db-
8110: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
8120: 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d  .      for(pEnd=
8130: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
8140: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
8150: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8160: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
8170: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
8180: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
8190: 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45  pEnd=&p[N]; p<pE
81a0: 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
81b0: 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d  assert( (&p[1])=
81c0: 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62  =pEnd || p[0].db
81d0: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20  ==p[1].db );..  
81e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
81f0: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
8200: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
8210: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
8220: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
8230: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
8240: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
8250: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
8260: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
8270: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
8280: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
8290: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
82a0: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
82b0: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
82c0: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
82d0: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
82e0: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
82f0: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
8300: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
8310: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
8320: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
8330: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
8340: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
8350: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
8360: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
8370: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
8380: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
8390: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
83a0: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
83b0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
83c0: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
83d0: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
83e0: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
83f0: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
8400: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
8410: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
8420: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
8430: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
8440: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
8450: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
8460: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
8470: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
8480: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
8490: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
84a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
84b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
84c0: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67  p->flags&(MEM_Ag
84d0: 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72  g|MEM_Dyn|MEM_Fr
84e0: 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20  ame|MEM_RowSet) 
84f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8500: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
8510: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
8520: 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20   if( p->zMalloc 
8530: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8540: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
8550: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
8560: 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30    p->zMalloc = 0
8570: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
8580: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
8590: 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 7d 0a 20  Invalid;.    }. 
85a0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
85b0: 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69  led = malloc_fai
85c0: 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  led;.  }.}../*.*
85d0: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
85e0: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
85f0: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
8600: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
8610: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
8620: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
8630: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
8640: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
8650: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8660: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
8670: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
8680: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
8690: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
86a0: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
86b0: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
86c0: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
86d0: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
86e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
86f0: 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29  >nChildCsr; i++)
8700: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8710: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76  eFreeCursor(p->v
8720: 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  , apCsr[i]);.  }
8730: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
8740: 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69  ay(aMem, p->nChi
8750: 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  ldMem);.  sqlite
8760: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
8770: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
8780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
8790: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
87a0: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
87b0: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
87c0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
87d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
87e0: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
87f0: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
8800: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
8810: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
8820: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
8830: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
8840: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
8850: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
8860: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
8870: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
8880: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
8890: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
88a0: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
88b0: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
88c0: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
88d0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
88e0: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
88f0: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
8900: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
8910: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
8920: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
8930: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
8940: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
8950: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
8960: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
8970: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
8980: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
8990: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
89a0: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
89b0: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
89c0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
89d0: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
89e0: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
89f0: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
8a00: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a20: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
8a30: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
8a60: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
8a70: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
8a80: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8ab0: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
8ac0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
8ad0: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
8ae0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8af0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
8b00: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
8b10: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
8b40: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
8b50: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
8b60: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
8b90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
8ba0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8bd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
8be0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
8c10: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
8c20: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
8c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8c40: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
8c50: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
8c60: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
8c70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
8c80: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
8c90: 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  UN );.  assert( 
8ca0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
8cb0: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
8cc0: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
8cd0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
8ce0: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
8cf0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
8d00: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
8d10: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
8d20: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
8d30: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
8d40: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
8d50: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
8d60: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
8d70: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
8d80: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
8d90: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
8da0: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
8db0: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
8dc0: 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20  ray(pMem, 8);.  
8dd0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
8de0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
8df0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
8e00: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
8e10: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
8e20: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
8e30: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
8e40: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
8e50: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
8e60: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
8e70: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  ed.  */.    db->
8e80: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
8e90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8ea0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
8eb0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
8ec0: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
8ed0: 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77  ows reaches nRow
8ee0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
8ef0: 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61  .  ** listing ha
8f00: 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73  s finished and s
8f10: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68  qlite3_step() sh
8f20: 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49  ould return SQLI
8f30: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52  TE_DONE..  ** nR
8f40: 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  ow is the sum of
8f50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
8f60: 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
8f70: 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20  program, plus.  
8f80: 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ** the sum of th
8f90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
8fa0: 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20   in all trigger 
8fb0: 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f  subprograms enco
8fc0: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20  untered.  ** so 
8fd0: 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76  far.  The nRow v
8fe0: 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  alue will increa
8ff0: 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65  se as new trigge
9000: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
9010: 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  e.  ** encounter
9020: 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69  ed, but p->pc wi
9030: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  ll eventually ca
9040: 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a  tch up to nRow..
9050: 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d    */.  nRow = p-
9060: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65  >nOp;.  if( p->e
9070: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
9080: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20   /* The first 8 
9090: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65  memory cells are
90a0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65   used for the re
90b0: 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65  sult set.  So we
90c0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d   will.    ** com
90d0: 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20  mandeer the 9th 
90e0: 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73  cell to use as s
90f0: 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72  torage for an ar
9100: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a  ray of pointers.
9110: 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65      ** to trigge
9120: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  r subprograms.  
9130: 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72  The VDBE is guar
9140: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61  anteed to have a
9150: 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a  t least 9.    **
9160: 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20   cells.  */.    
9170: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e  assert( p->nMem>
9180: 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20  9 );.    pSub = 
9190: 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20  &p->aMem[9];.   
91a0: 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73   if( pSub->flags
91b0: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
91c0: 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72     /* On the fir
91d0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
91e0: 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20  e3_step(), pSub 
91f0: 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c  will hold a NULL
9200: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a  .  It is.      *
9210: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  * initialized to
9220: 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50   a BLOB by the P
9230: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f  4_SUBPROGRAM pro
9240: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65  cessing logic be
9250: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75  low */.      nSu
9260: 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65  b = pSub->n/size
9270: 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20  of(Vdbe*);.     
9280: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
9290: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
92a0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
92b0: 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29  =0; i<nSub; i++)
92c0: 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20  {.      nRow += 
92d0: 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[i]->nOp;. 
92e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
92f0: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
9300: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f  .  }while( i<nRo
9310: 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  w && p->explain=
9320: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
9330: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
9340: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e  in );.  if( i>=n
9350: 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  Row ){.    p->rc
9360: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9370: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
9380: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
9390: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
93a0: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
93b0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
93c0: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
93d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
93e0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
93f0: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
9400: 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  b, "%s", sqlite3
9410: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a  ErrStr(p->rc));.
9420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
9430: 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a  r *zP4;.    Op *
9440: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
9450: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
9460: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
9470: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
9480: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
9490: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
94a0: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
94b0: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
94c0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
94d0: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
94e0: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
94f0: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
9500: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
9510: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
9520: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
9530: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
9540: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
9550: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
9560: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
9570: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
9580: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
9590: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
95a0: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
95b0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
95c0: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
95d0: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
95e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
95f0: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
9600: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9610: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
9620: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9630: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
9640: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
9650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
9680: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
9690: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
96a0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
96b0: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
96c0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
96d0: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
96e0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
96f0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
9700: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
9710: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
9720: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
9730: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
9740: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
9750: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
9760: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
9770: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
9780: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
9790: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
97a0: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
97b0: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
97c0: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
97d0: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
97e0: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
97f0: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
9800: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
9810: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
9820: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
9830: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
9840: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
9850: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
9860: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
9870: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
9880: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
9890: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
98a0: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
98b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
98c0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
98d0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
98e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
98f0: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
9900: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
9910: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
9920: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
9930: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
9940: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
9950: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
9960: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
9970: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
9980: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
9990: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
99a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
99b0: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e  w(pSub, nByte, n
99c0: 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Sub!=0) ){.     
99d0: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
99e0: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
99f0: 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ->z;.          a
9a00: 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70  pSub[nSub++] = p
9a10: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  Op->p4.pProgram;
9a20: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
9a30: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c  >flags |= MEM_Bl
9a40: 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ob;.          pS
9a50: 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a  ub->n = nSub*siz
9a60: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
9a70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9a80: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
9a90: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
9aa0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
9ab0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
9ae0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
9af0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
9b00: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
9b10: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9b20: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
9b30: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
9b40: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9b60: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  2 */.    pMem->t
9b70: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
9b80: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
9b90: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
9ba0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
9bb0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
9bc0: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
9bf0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
9c00: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
9c10: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73  em++;..    if( s
9c20: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
9c30: 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29  w(pMem, 32, 0) )
9c40: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
9c50: 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  P4 */.      asse
9c60: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
9c70: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
9c80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
9c90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
9ca0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9cb0: 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45  M_Dyn|MEM_Str|ME
9cc0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20  M_Term;.    zP4 
9cd0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
9ce0: 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20   pMem->z, 32);. 
9cf0: 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d     if( zP4!=pMem
9d00: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ->z ){.      sql
9d10: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
9d20: 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c  r(pMem, zP4, -1,
9d30: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
9d40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9d50: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
9d60: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
9d70: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
9d80: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
9d90: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
9da0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
9db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
9dc0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9dd0: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  TEXT;.    pMem++
9de0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
9df0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
9e00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
9e10: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34  eMemGrow(pMem, 4
9e20: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
9e30: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
9e40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9e50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9e60: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9e70: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
9e80: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
9e90: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9ea0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
9eb0: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
9ec0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
9ed0: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
9ee0: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
9ef0: 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  5 */.      pMem-
9f00: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
9f10: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
9f20: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
9f30: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
9f40: 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.  .#ifdef SQLI
9f50: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
9f60: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
9f70: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
9f80: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 35 30  MemGrow(pMem, 50
9f90: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  0, 0) ){.       
9fa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
9fb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9fc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9fd0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
9fe0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
9ff0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
a000: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
a010: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
a020: 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e   = displayCommen
a030: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d  t(pOp, zP4, pMem
a040: 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20  ->z, 500);.     
a050: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
a060: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
a070: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
a080: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a  ITE_UTF8;.#else.
a090: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
a0a0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
a0d0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
a0e0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  pe = SQLITE_NULL
a0f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
a100: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
a110: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
a120: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
a130: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
a140: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70  ->aMem[1];.    p
a150: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
a160: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
a170: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
a180: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
a190: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a1a0: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
a1b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a1c0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
a1d0: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
a1e0: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
a1f0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
a200: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
a210: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
a220: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p){.  const char
a230: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   *z = 0;.  if( p
a240: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20  ->zSql ){.    z 
a250: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c  = p->zSql;.  }el
a260: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31  se if( p->nOp>=1
a270: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64   ){.    const Vd
a280: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
a290: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[0];.    if( 
a2a0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
a2b0: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
a2c0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
a2d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
a2e0: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
a2f0: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
a300: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
a310: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
a320: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
a330: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
a340: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a350: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
a360: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
a370: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
a380: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
a390: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
a3a0: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
a3b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
a3c0: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
a3d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
a3e0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
a3f0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
a400: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
a410: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
a420: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
a430: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
a440: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
a450: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
a460: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
a470: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
a480: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
a490: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
a4a0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
a4b0: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
a4c0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
a4d0: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
a4e0: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
a4f0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
a500: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
a510: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a520: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
a530: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
a540: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
a550: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
a560: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
a570: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a580: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
a590: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
a5a0: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
a5b0: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
a5c0: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
a5d0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
a5e0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
a5f0: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
a600: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
a610: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  /../*.** Allocat
a620: 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66  e space from a f
a630: 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72  ixed size buffer
a640: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
a650: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
a660: 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75   space.  If insu
a670: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
a680: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
a690: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
a6a0: 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74  The pBuf paramet
a6b0: 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  er is the initia
a6c0: 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69  l value of a poi
a6d0: 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a  nter which will.
a6e0: 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e  ** receive the n
a6f0: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66  ew memory.  pBuf
a700: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c   is normally NUL
a710: 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e  L.  If pBuf is n
a720: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d  ot.** NULL, it m
a730: 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79  eans that memory
a740: 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61   space has alrea
a750: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
a760: 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68  d and that.** th
a770: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
a780: 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  d not allocate a
a790: 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  ny new memory.  
a7a0: 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74  When pBuf is not
a7b0: 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20  .** NULL simply 
a7c0: 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e  return pBuf.  On
a7d0: 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20  ly allocate new 
a7e0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65  memory space whe
a7f0: 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c  n pBuf.** is NUL
a800: 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69  L..**.** nByte i
a810: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
a820: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e  bytes of space n
a830: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70  eeded..**.** *pp
a840: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61  From points to a
a850: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61  vailable space a
a860: 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74  nd pEnd points t
a870: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
a880: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70  .** available sp
a890: 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65  ace.  When space
a8a0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a   is allocated, *
a8b0: 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63  ppFrom is advanc
a8c0: 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65  ed past.** the e
a8d0: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
a8e0: 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ted space..**.**
a8f0: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f   *pnByte is a co
a900: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
a910: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
a920: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
a930: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
a940: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
a950: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
a960: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f   space in *ppFro
a970: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  m to satisfy the
a980: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65  .** request, the
a990: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  n increment *pnB
a9a0: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  yte by the amoun
a9b0: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
a9c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a9d0: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
a9e0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
a9f0: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65       /* Where re
aa00: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c  turn pointer wil
aa10: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20  l be stored */. 
aa20: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
aa30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
aa40: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
aa50: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  cate */.  u8 **p
aa60: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f  pFrom,         /
aa70: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61  * IN/OUT: Alloca
aa80: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20  te from *ppFrom 
aa90: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20  */.  u8 *pEnd,  
aaa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
aab0: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70  nter to 1 byte p
aac0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a  ast the end of *
aad0: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f  ppFrom buffer */
aae0: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20  .  int *pnByte  
aaf0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
ab00: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  location cannot 
ab10: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65  be made, increme
ab20: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b  nt *pnByte */.){
ab30: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
ab40: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
ab50: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  *ppFrom) );.  if
ab60: 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20  ( pBuf ) return 
ab70: 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20  pBuf;.  nByte = 
ab80: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
ab90: 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b   if( &(*ppFrom)[
aba0: 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29  nByte] <= pEnd )
abb0: 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f  {.    pBuf = (vo
abc0: 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20  id*)*ppFrom;.   
abd0: 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74   *ppFrom += nByt
abe0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
abf0: 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65  *pnByte += nByte
ac00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ac10: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Buf;.}../*.** Re
ac20: 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61  wind the VDBE ba
ac30: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
ac40: 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69  ing in preparati
ac50: 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e  on for.** runnin
ac60: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  g it..*/.void sq
ac70: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
ac80: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65  Vdbe *p){.#if de
ac90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
aca0: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
acb0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69  DBE_PROFILE).  i
acc0: 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nt i;.#endif.  a
acd0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
ace0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
acf0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
ad00: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
ad10: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
ad20: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
ad30: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
ad40: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
ad50: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
ad60: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
ad70: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
ad80: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20  than later. */. 
ad90: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
ada0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66  _MAGIC_RUN;..#if
adb0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
adc0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d  .  for(i=1; i<p-
add0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
ade0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
adf0: 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  [i].db==p->db );
ae00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
ae10: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
ae20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ae30: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
ae40: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
ae50: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
ae60: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
ae70: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
ae80: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
ae90: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
aea0: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
aeb0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
aec0: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
aed0: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
aee0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
aef0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
af00: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
af10: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
af20: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
af30: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
af40: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
af50: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
af60: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
af70: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
af80: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
af90: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
afa0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
afb0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
afc0: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
afd0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
afe0: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
aff0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
b000: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
b010: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
b020: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
b030: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
b040: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
b050: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
b060: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
b070: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
b080: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
b090: 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20  lled exact once 
b0a0: 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61  on a each virtua
b0b0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
b0c0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
b0d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
b0e0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
b0f0: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
b100: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
b110: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
b120: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74  e is called, fut
b130: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
b140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b150: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
b160: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
b170: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
b180: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
b190: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
b1a0: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
b1b0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
b1c0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
b1d0: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
b1e0: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
b1f0: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
b200: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
b210: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
b220: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
b230: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
b240: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
b250: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
b260: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
b270: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
b280: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
b290: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
b2a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b2b0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
b2c0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b2e0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
b2f0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b310: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b320: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b330: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
b340: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
b350: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
b360: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
b370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b380: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b390: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
b3a0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b3d0: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
b3e0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
b3f0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
b400: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b410: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
b420: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
b430: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
b440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b450: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
b460: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
b470: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20  */.  int nOnce; 
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b4a0: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
b4b0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
b4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
b4e0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
b4f0: 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20  8 *zCsr;        
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b510: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
b520: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
b530: 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20   */.  u8 *zEnd; 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
b560: 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65  te past allocate
b570: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
b580: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b5a0: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
b5b0: 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20  emory is needed 
b5c0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
b5d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b5e0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
b5f0: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
b600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b610: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
b620: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 64 62 20 3d  C_INIT );.  db =
b630: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
b640: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
b650: 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
b660: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
b670: 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
b680: 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
b690: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
b6a0: 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
b6b0: 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e  ->nMaxArg;.  nOn
b6c0: 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  ce = pParse->nOn
b6d0: 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d  ce;.  if( nOnce=
b6e0: 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20  =0 ) nOnce = 1; 
b6f0: 2f 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61  /* Ensure at lea
b700: 73 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70  st one byte in p
b710: 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f  ->aOnceFlag[] */
b720: 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  .  .  /* For eac
b730: 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65  h cursor require
b740: 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  d, also allocate
b750: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
b760: 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c  Memory.  ** cell
b770: 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f  s (nMem+1-nCurso
b780: 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73  r)..nMem, inclus
b790: 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20  ive, will never 
b7a0: 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  be used by.  ** 
b7b0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
b7c0: 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61  . Instead they a
b7d0: 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  re used to alloc
b7e0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20  ate space for.  
b7f0: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74  ** VdbeCursor/Bt
b800: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  Cursor structure
b810: 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d  s. The blob of m
b820: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
b830: 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73   with .  ** curs
b840: 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69  or 0 is stored i
b850: 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d  n memory cell nM
b860: 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20  em. Memory cell 
b870: 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74  (nMem-1).  ** st
b880: 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66  ores the blob of
b890: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
b8a0: 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31  ed with cursor 1
b8b0: 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  , etc..  **.  **
b8c0: 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63   See also: alloc
b8d0: 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a  ateCursor()..  *
b8e0: 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72  /.  nMem += nCur
b8f0: 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  sor;..  /* Alloc
b900: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
b910: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20  mory registers, 
b920: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56  SQL variables, V
b930: 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20  DBE cursors and 
b940: 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74  .  ** an array t
b950: 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75  o marshal SQL fu
b960: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
b970: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72   in..  */.  zCsr
b980: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b   = (u8*)&p->aOp[
b990: 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f  p->nOp];       /
b9a0: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62  * Memory avaliab
b9b0: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
b9c0: 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75  n */.  zEnd = (u
b9d0: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  8*)&p->aOp[p->nO
b9e0: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72  pAlloc];  /* Fir
b9f0: 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64  st byte past end
ba00: 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20   of zCsr[] */.. 
ba10: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
ba20: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
ba30: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
ba40: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
ba50: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
ba60: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
ba70: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
ba80: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
ba90: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
baa0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  = 10;.  }.  mems
bab0: 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64  et(zCsr, 0, zEnd
bac0: 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b  -zCsr);.  zCsr +
bad0: 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30  = (zCsr - (u8*)0
bae0: 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45  )&7;.  assert( E
baf0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
bb00: 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70  ENT(zCsr) );.  p
bb10: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
bb20: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
bb30: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
bb40: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
bb50: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
bb60: 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   in two.  ** pas
bb70: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
bb80: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
bb90: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
bba0: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
bbb0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
bbc0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
bbd0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
bbe0: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
bbf0: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
bc00: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
bc10: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
bc20: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
bc30: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
bc40: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
bc50: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
bc60: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
bc70: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
bc80: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
bc90: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
bca0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
bcb0: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
bcc0: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
bcd0: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
bce0: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
bcf0: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
bd00: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
bd10: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
bd20: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
bd30: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
bd40: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
bd50: 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  do {.    nByte =
bd60: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
bd70: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
bd80: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
bd90: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
bda0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
bdb0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
bdc0: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
bdd0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
bde0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
bdf0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
be00: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
be10: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
be20: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
be30: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
be40: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61  te);.    p->azVa
be50: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
be60: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
be70: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
be80: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
be90: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
bea0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
beb0: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
bec0: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
bed0: 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  *),.            
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
bef0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
bf00: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65  e);.    p->aOnce
bf10: 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Flag = allocSpac
bf20: 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  e(p->aOnceFlag, 
bf30: 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45  nOnce, &zCsr, zE
bf40: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
bf50: 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
bf60: 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73      p->pFree = s
bf70: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
bf80: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
bf90: 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20     }.    zCsr = 
bfa0: 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45  p->pFree;.    zE
bfb0: 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65  nd = &zCsr[nByte
bfc0: 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79  ];.  }while( nBy
bfd0: 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  te && !db->mallo
bfe0: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
bff0: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
c000: 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c  or;.  p->nOnceFl
c010: 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66  ag = nOnce;.  if
c020: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
c030: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
c040: 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28  r)nVar;.    for(
c050: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
c060: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  ){.      p->aVar
c070: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
c080: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Null;.      p->a
c090: 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Var[n].db = db;.
c0a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c0b0: 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20  p->azVar ){.    
c0c0: 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73  p->nzVar = pPars
c0d0: 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65  e->nzVar;.    me
c0e0: 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70  mcpy(p->azVar, p
c0f0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d  Parse->azVar, p-
c100: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d  >nzVar*sizeof(p-
c110: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20  >azVar[0]));.   
c120: 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e   memset(pParse->
c130: 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65  azVar, 0, pParse
c140: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
c150: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29  Parse->azVar[0])
c160: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
c170: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61  aMem ){.    p->a
c180: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
c190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
c1a0: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
c1b0: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70  1..nMem */.    p
c1c0: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c1e0: 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d  *       not from
c1f0: 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20   0..nMem-1 */.  
c200: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
c210: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
c220: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
c230: 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a   = MEM_Invalid;.
c240: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
c250: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
c260: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e    }.  p->explain
c270: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
c280: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  in;.  sqlite3Vdb
c290: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
c2a0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
c2b0: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
c2c0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
c2d0: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
c2e0: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
c2f0: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
c300: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
c310: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
c320: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
c330: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
c340: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c350: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  .  sqlite3VdbeSo
c360: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
c370: 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78   pCx);.  if( pCx
c380: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
c390: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
c3a0: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
c3b0: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
c3c0: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
c3d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
c3e0: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
c3f0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
c400: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
c410: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
c420: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
c430: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
c440: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
c450: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
c460: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
c470: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
c480: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
c490: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
c4a0: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
c4b0: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
c4c0: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
c4d0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
c4e0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78  e *pModule = pCx
c4f0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70  ->pModule;.    p
c500: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
c510: 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d   1;.    pModule-
c520: 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
c530: 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  sor);.    p->inV
c540: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
c550: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
c560: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
c570: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
c580: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
c590: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
c5a0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
c5b0: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
c5c0: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
c5d0: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
c5e0: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
c5f0: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
c600: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
c610: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
c620: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
c630: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
c640: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
c650: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61  Frame->v;.  v->a
c660: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
c670: 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->aOnceFlag;.  
c680: 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->nOnceFlag = p
c690: 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67  Frame->nOnceFlag
c6a0: 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  ;.  v->aOp = pFr
c6b0: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
c6c0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
c6d0: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
c6e0: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
c6f0: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
c700: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
c710: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
c720: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
c730: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
c740: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
c750: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
c760: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
c770: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
c780: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75  >nChange;.  retu
c790: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
c7a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
c7b0: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
c7c0: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
c7d0: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
c7e0: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
c7f0: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
c800: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
c810: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
c820: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
c830: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
c840: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
c850: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
c860: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
c870: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
c880: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
c890: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
c8a0: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
c8b0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
c8c0: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
c8d0: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
c8e0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
c8f0: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66  e *pFrame;.    f
c900: 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
c910: 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
c920: 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
c930: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
c940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
c950: 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
c960: 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72  e);.  }.  p->pFr
c970: 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ame = 0;.  p->nF
c980: 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  rame = 0;..  if(
c990: 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20   p->apCsr ){.   
c9a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
c9b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
c9c0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56  r; i++){.      V
c9d0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
c9e0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
c9f0: 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20     if( pC ){.   
ca00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ca10: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
ca20: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
ca30: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
ca40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ca50: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
ca60: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
ca70: 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20  ay(&p->aMem[1], 
ca80: 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  p->nMem);.  }.  
ca90: 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72  while( p->pDelFr
caa0: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
cab0: 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e  rame *pDel = p->
cac0: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70  pDelFrame;.    p
cad0: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44  ->pDelFrame = pD
cae0: 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  el->pParent;.   
caf0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
cb00: 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  eDelete(pDel);. 
cb10: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
cb20: 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f  any auxdata allo
cb30: 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20  cations made by 
cb40: 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69  the VM */.  sqli
cb50: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
cb60: 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a  Data(p, -1, 0);.
cb70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75    assert( p->pAu
cb80: 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xData==0 );.}../
cb90: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
cba0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
cbb0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
cbc0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
cbd0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
cbe0: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
cbf0: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
cc00: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
cc10: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
cc20: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
cc30: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
cc40: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
cc50: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
cc60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
cc70: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
cc80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
cc90: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
cca0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
ccb0: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
ccc0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
ccd0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
cce0: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
ccf0: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
cd00: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
cd10: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
cd20: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
cd30: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
cd40: 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
cd50: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
cd60: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
cd70: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
cd80: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
cd90: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
cda0: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
cdb0: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
cdc0: 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20  gs==MEM_Invalid 
cdd0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
cde0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
cdf0: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
ce00: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
ce10: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
ce20: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
ce30: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
ce40: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
ce50: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
ce60: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
ce70: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
ce80: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
ce90: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
cea0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
ceb0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
cec0: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
ced0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
cee0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
cef0: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
cf00: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
cf10: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
cf20: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
cf30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cf40: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
cf50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
cf60: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
cf70: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
cf80: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
cf90: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
cfa0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
cfb0: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
cfc0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
cfd0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
cfe0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
cff0: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
d000: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
d010: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
d020: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
d030: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
d040: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
d050: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
d060: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
d070: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
d080: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
d090: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d0a0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
d0b0: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
d0c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
d0d0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
d0e0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
d0f0: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
d100: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d110: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
d120: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
d130: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
d140: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
d150: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
d160: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
d170: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
d180: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
d190: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
d1a0: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
d1b0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
d1c0: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
d1d0: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
d1e0: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
d1f0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
d200: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
d210: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
d220: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d230: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
d240: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
d250: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d260: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
d270: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
d280: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
d290: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
d2a0: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
d2b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
d2c0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
d2d0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
d300: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
d310: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
d340: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
d350: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
d360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
d380: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
d390: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
d3a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
d3b0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
d3c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
d3d0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
d3e0: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
d3f0: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d410: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
d420: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
d430: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
d440: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
d450: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
d460: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
d470: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
d480: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
d490: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
d4a0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d4b0: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
d4c0: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
d4d0: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
d4e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d4f0: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
d500: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
d510: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
d520: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
d530: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
d540: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
d550: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
d560: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
d570: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
d580: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
d590: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
d5a0: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
d5b0: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
d5c0: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
d5d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d5e0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
d5f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
d600: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
d610: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
d620: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
d630: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
d640: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
d650: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
d660: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
d670: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
d680: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
d690: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
d6a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
d6b0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
d6c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d6d0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
d6e0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
d6f0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
d700: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
d710: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
d720: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
d730: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
d740: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
d750: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
d760: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d770: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
d780: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
d790: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
d7a0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d7b0: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
d7c0: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
d7d0: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
d7e0: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
d7f0: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
d800: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
d810: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
d820: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
d830: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
d840: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
d850: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
d860: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
d870: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
d880: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
d890: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
d8a0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
d8b0: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
d8c0: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
d8d0: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
d8e0: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
d8f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
d900: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
d910: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
d920: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
d930: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
d940: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
d950: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d960: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
d970: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b  VtabSync(db, p);
d980: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
d990: 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
d9a0: 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
d9b0: 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
d9c0: 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
d9d0: 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
d9e0: 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
d9f0: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
da00: 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
da10: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
da20: 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
da30: 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
da40: 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
da50: 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
da60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
da70: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
da80: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
da90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
daa0: 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
dab0: 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
dac0: 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
dad0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
dae0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
daf0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
db00: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
db10: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
db20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
db30: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
db40: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
db50: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
db60: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
db70: 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  ns++;.      sqli
db80: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
db90: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
dba0: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
dbb0: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
dbc0: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
dbd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
dbe0: 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
dbf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
dc00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dc10: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
dc20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
dc30: 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
dc40: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
dc50: 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
dc60: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
dc70: 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
dc80: 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
dc90: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
dca0: 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
dcb0: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
dcc0: 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
dcd0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
dce0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
dcf0: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
dd00: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
dd10: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
dd20: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
dd30: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
dd40: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
dd50: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
dd60: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
dd70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
dd80: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
dd90: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
dda0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
ddb0: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
ddc0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
ddd0: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
dde0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
ddf0: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
de00: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
de10: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
de20: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
de30: 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
de40: 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
de50: 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
de60: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
de70: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
de80: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
de90: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
dea0: 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
deb0: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
dec0: 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
ded0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
dee0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
def0: 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
df00: 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
df10: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
df20: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
df30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
df40: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
df50: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
df60: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
df70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
df80: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
df90: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
dfa0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
dfb0: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
dfc0: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
dfd0: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
dfe0: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
dff0: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
e000: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
e010: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
e020: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
e030: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
e040: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
e050: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
e060: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
e070: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
e080: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
e090: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
e0a0: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
e0b0: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
e0c0: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
e0d0: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
e0e0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
e0f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e100: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e110: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
e120: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e130: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
e140: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
e150: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e160: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
e170: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
e180: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
e190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e1a0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
e1b0: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
e1c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
e1d0: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
e1e0: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
e1f0: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
e200: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
e210: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
e220: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
e230: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
e240: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e250: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
e260: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
e270: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e280: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
e290: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
e2a0: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
e2b0: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
e2c0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
e2d0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
e2e0: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
e2f0: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
e300: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
e310: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
e320: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
e330: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
e340: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
e350: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
e360: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
e370: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
e380: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
e390: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
e3a0: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
e3b0: 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
e3c0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
e3d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e3e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
e3f0: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
e400: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
e410: 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
e420: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
e430: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
e440: 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
e450: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
e460: 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
e470: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e480: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
e490: 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
e4a0: 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
e4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e4c0: 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
e4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e4e0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
e4f0: 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
e500: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
e510: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e520: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
e530: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
e540: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e550: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e560: 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
e570: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e580: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
e590: 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
e5a0: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
e5b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e5c0: 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
e5d0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
e5e0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
e5f0: 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
e600: 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
e610: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e620: 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
e630: 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
e640: 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
e670: 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
e680: 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
e690: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
e6a0: 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
e6b0: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
e6c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
e6d0: 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
e6e0: 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
e6f0: 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
e700: 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
e710: 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
e720: 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
e730: 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
e740: 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
e750: 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
e760: 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
e770: 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
e780: 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
e790: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
e7a0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
e7b0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
e7c0: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
e7d0: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
e7e0: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
e7f0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e800: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
e810: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
e820: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
e830: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e840: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
e850: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
e860: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
e870: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
e880: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
e890: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
e8a0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
e8b0: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
e8c0: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
e8d0: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
e8e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e8f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e910: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
e920: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e930: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
e940: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
e950: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
e960: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
e970: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
e980: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
e990: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e9a0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
e9b0: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
e9c0: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
e9d0: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
e9e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e9f0: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
ea00: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
ea10: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
ea20: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
ea30: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
ea40: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
ea50: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
ea60: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
ea70: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
ea80: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
ea90: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
eaa0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
eab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
eac0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
ead0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
eae0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
eaf0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
eb00: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
eb10: 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
eb20: 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
eb30: 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
eb40: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
eb50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
eb60: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
eb70: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
eb80: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
eb90: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
eba0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
ebb0: 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
ebc0: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
ebd0: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
ebe0: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
ebf0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
ec00: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
ec10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ec20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
ec30: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
ec40: 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
ec50: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
ec60: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
ec70: 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
ec80: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
ec90: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
eca0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ecb0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ecc0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
ecd0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
ece0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
ecf0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
ed00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
ed10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ed20: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
ed30: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ed40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ed50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ed60: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
ed70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
ed80: 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
ed90: 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
eda0: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
edb0: 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
edc0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
edd0: 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
ede0: 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
edf0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
ee00: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
ee10: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
ee20: 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
ee30: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
ee40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
ee50: 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
ee60: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
ee70: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
ee80: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
ee90: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
eea0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
eeb0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
eec0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
eed0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
eee0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
eef0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
ef00: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
ef10: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
ef20: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
ef30: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
ef40: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
ef50: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
ef60: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
ef70: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
ef80: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
ef90: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
efa0: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
efb0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
efc0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
efd0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
efe0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
eff0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
f000: 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
f010: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
f020: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
f030: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
f040: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
f050: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
f060: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
f070: 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
f080: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
f090: 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
f0a0: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
f0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
f0c0: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
f0d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
f0e0: 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
f0f0: 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
f100: 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
f110: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
f120: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
f130: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
f140: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f150: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f160: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
f170: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f180: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
f190: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
f1a0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f1b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
f1c0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
f1d0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
f1e0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
f1f0: 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
f200: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
f220: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
f230: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f240: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
f250: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
f260: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f270: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
f280: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
f290: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
f2a0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
f2b0: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
f2c0: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
f2d0: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
f2e0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
f2f0: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
f300: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
f310: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
f320: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
f330: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
f340: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
f350: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
f360: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
f370: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f380: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
f390: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
f3a0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
f3b0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
f3c0: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
f3d0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
f3e0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
f3f0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
f400: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
f410: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
f420: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
f430: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
f440: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
f450: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
f460: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
f470: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
f480: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
f490: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
f4a0: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
f4b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f4c0: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
f4d0: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
f4e0: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
f4f0: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
f500: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
f510: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
f520: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
f530: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
f540: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
f550: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f560: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
f570: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
f580: 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
f590: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
f5a0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
f5b0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
f5c0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
f5d0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
f5e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
f5f0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
f600: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
f610: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
f620: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
f630: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
f640: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
f650: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
f660: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
f670: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
f680: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
f690: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
f6a0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
f6b0: 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76  lite3.nVdbeActiv
f6c0: 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  e count variable
f6d0: 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
f6e0: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
f6f0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
f700: 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
f710: 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
f720: 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
f730: 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
f740: 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
f750: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
f760: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
f770: 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
f780: 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
f790: 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
f7a0: 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
f7b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
f7c0: 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
f7d0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
f7e0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
f7f0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
f800: 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
f810: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
f820: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
f830: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  = 0;.  int nWrit
f840: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65  e = 0;.  int nRe
f850: 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  ad = 0;.  p = db
f860: 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
f870: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
f880: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
f890: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63  GIC_RUN && p->pc
f8a0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  >=0 ){.      cnt
f8b0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
f8c0: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
f8d0: 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
f8e0: 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
f8f0: 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
f900: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
f910: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
f920: 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
f930: 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
f940: 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
f950: 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
f960: 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
f970: 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
f980: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
f990: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
f9a0: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
f9b0: 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
f9c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
f9d0: 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
f9e0: 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
f9f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
fa00: 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
fa10: 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
fa20: 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
fa30: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
fa40: 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
fa50: 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
fa60: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
fa70: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
fa80: 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
fa90: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
faa0: 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
fab0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
fac0: 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
fad0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
fae0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
faf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
fb00: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
fb10: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
fb20: 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
fb30: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
fb40: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
fb50: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
fb60: 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
fb70: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
fb80: 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
fb90: 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
fba0: 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
fbb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
fbc0: 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
fbd0: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
fbe0: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
fbf0: 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
fc00: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
fc10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
fc20: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
fc30: 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
fc40: 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
fc50: 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
fc60: 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
fc70: 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  urred, causing a
fc80: 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
fc90: 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
fca0: 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
fcb0: 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
fcc0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
fcd0: 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
fce0: 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
fcf0: 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
fd00: 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
fd10: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
fd20: 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
fd30: 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
fd40: 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
fd50: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
fd60: 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
fd70: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
fd80: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
fd90: 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
fda0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
fdb0: 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
fdc0: 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
fdd0: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
fde0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
fdf0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
fe00: 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
fe10: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
fe20: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
fe30: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
fe40: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
fe50: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
fe60: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
fe70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
fe80: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
fe90: 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
fea0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
feb0: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
fec0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fed0: 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
fee0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
fef0: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
ff00: 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
ff10: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
ff20: 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
ff30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ff40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ff50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ff60: 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
ff70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ff80: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
ff90: 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
ffa0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
ffb0: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
ffc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ffd0: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
ffe0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
fff0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10000 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
10010 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
10020 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
10030 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
10040 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
10050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
10070 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
10080 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10090 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
100a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
100b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
100c0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
100d0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
100e0 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
100f0 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20  estore the .    
10100 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
10110 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
10120 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
10130 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
10140 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a  had when .    **
10150 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
10160 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
10170 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  pened.  */.    i
10180 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
10190 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
101a0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
101b0 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
101c0 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64  DefCons;.      d
101d0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
101e0 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
101f0 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  fImmCons;.    }.
10200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
10220 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
10230 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
10240 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
10250 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
10260 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
10270 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
10280 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
10290 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
102a0 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
102b0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
102c0 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
102d0 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
102e0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
102f0 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
10300 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
10310 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
10320 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
10330 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
10340 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
10350 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
10360 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
10370 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
10380 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
10390 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
103a0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
103b0 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
103c0 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
103d0 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
103e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
103f0 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
10400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
10410 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
10420 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
10430 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
10440 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
10450 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
10460 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
10470 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
10480 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
10490 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
104a0 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
104b0 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
104c0 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
104d0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
104e0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
104f0 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
10500 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
10510 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
10520 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
10530 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52  ErrMsg, db, "FOR
10540 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
10550 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
10560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10570 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
10580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10590 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
105a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
105b0 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
105c0 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
105d0 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
105e0 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
105f0 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
10600 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
10610 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
10620 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
10630 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
10640 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
10650 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
10660 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10670 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
10680 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
10690 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
106a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
106b0 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
106c0 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
106d0 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
106e0 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
106f0 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
10700 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
10710 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
10720 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
10730 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
10740 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
10750 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
10760 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
10770 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
10780 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
10790 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
107a0 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
107b0 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
107c0 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
107d0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
107e0 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
107f0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
10800 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
10810 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
10830 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
10840 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
10850 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
10860 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
10870 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
10880 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
10890 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
108a0 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
108b0 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
108c0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
108d0 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
108e0 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
108f0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
10900 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
10910 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
10920 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
10930 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
10940 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
10950 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
10960 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
10970 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
10980 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
10990 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
109a0 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
109b0 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
109c0 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
109d0 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
109e0 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
109f0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
10a00 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
10a10 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
10a20 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
10a30 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
10a40 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
10a50 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
10a60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
10a70 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
10a80 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10a90 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
10aa0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
10ab0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
10ac0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10ad0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63   }.  if( p->aOnc
10ae0 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70  eFlag ) memset(p
10af0 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20  ->aOnceFlag, 0, 
10b00 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20  p->nOnceFlag);. 
10b10 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
10b20 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
10b30 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
10b40 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
10b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10b60 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
10b70 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
10b80 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
10b90 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
10ba0 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
10bb0 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
10bc0 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
10bd0 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
10be0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
10bf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
10c00 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
10c10 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
10c20 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
10c30 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
10c40 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
10c50 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
10c60 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
10c70 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
10c80 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
10c90 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
10ca0 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
10cb0 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
10cc0 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
10cd0 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
10ce0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
10cf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
10d00 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
10d10 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
10d20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
10d30 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
10d40 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
10d50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
10d60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
10d70 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69  OCKED );  /* Thi
10d80 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65  s error no longe
10d90 72 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  r exists */.    
10da0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
10db0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
10dc0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
10dd0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10df0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
10e00 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
10e10 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
10e20 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
10e30 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
10e40 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
10e50 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
10e60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
10e70 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
10e80 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
10e90 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
10ea0 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
10eb0 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
10ec0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
10ed0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
10ee0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
10ef0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
10f00 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
10f10 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
10f20 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
10f30 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
10f40 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
10f50 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
10f60 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
10f70 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
10f80 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
10f90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
10fa0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
10fb0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
10fc0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
10fd0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
10fe0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
10ff0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
11000 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
11010 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
11020 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
11030 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
11040 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
11050 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
11060 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
11070 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
11080 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
11090 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
110a0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
110b0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
110c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
110d0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
110e0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
110f0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
11100 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
11110 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
11120 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
11130 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
11140 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
11150 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
11160 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
11170 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
11180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11190 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
111a0 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
111b0 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
111c0 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
111d0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
111e0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
111f0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
11200 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
11210 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
11220 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
11230 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11240 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
11250 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
11260 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
11270 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
11280 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
11290 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
112a0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
112b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
112c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
112d0 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
112e0 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
112f0 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
11300 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11320 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
11330 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
11340 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
11350 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
11360 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
11370 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
11380 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
11390 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
113a0 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
113b0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
113c0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
113d0 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
113e0 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
113f0 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
11400 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
11410 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
11420 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
11430 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
11440 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
11450 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
11460 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
11470 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
11480 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
11490 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
114a0 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
114b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
114c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
114d0 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
114e0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
114f0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
11500 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11510 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
11520 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
11530 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11540 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11550 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
11560 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
11570 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11580 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
11590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
115a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
115b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
115c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
115d0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
115e0 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
115f0 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
11600 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
11610 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
11620 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
11630 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
11640 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
11650 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
11660 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
11670 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
11680 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
11690 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
116a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
116b0 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
116c0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
116d0 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
116e0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
116f0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
11700 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
11710 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
11720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
11730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
11740 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
11750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11760 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
11770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
11780 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
11790 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
117a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
117b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
117c0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
117d0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
117e0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
117f0 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  E_OK);.        }
11800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11810 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
11820 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
11830 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
11840 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  mCons = 0;.     
11850 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
11860 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46  = ~SQLITE_DeferF
11870 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Ks;.          sq
11880 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
11890 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
118a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
118b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
118c0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
118d0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
118e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
118f0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
11900 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
11910 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
11920 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
11930 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11940 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
11950 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
11960 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
11970 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
11980 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
11990 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
119a0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
119b0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
119c0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
119d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
119e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
119f0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
11a00 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
11a10 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
11a20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11a30 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
11a40 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
11a50 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
11a60 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
11a70 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
11a80 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
11a90 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
11aa0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
11ab0 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
11ac0 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
11ad0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
11ae0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
11af0 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
11b00 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
11b10 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
11b20 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
11b30 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
11b40 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
11b50 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
11b60 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
11b70 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
11b80 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d  RAINT, then prom
11b90 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ote the.    ** c
11ba0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
11bb0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
11bc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
11bd0 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
11be0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
11bf0 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
11c00 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
11c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
11c20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11c30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11c40 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d  || (p->rc&0xff)=
11c50 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
11c60 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
11c70 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
11c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11c90 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
11ca0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
11cb0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
11cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11cd0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
11ce0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
11cf0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
11d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
11d10 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
11d20 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
11d30 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
11d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11d50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
11d60 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
11d70 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
11d80 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
11d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
11da0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
11db0 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
11dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
11dd0 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
11de0 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
11df0 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
11e00 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
11e10 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
11e20 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
11e30 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
11e40 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
11e50 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
11e60 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
11e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
11e80 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
11e90 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
11ea0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
11eb0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
11ec0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
11ed0 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
11ee0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
11ef0 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
11f00 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
11f10 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
11f20 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
11f30 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
11f40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
11f50 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
11f60 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
11f70 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
11f80 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
11f90 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
11fa0 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
11fb0 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
11fc0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
11fd0 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
11fe0 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
11ff0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12000 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
12010 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
12020 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
12030 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
12040 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
12050 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
12060 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
12070 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
12080 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12090 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
120a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
120b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
120c0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
120d0 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
120e0 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
120f0 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
12100 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
12110 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
12120 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
12130 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
12140 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
12150 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
12160 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
12170 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
12180 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
12190 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
121a0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
121b0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
121c0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
121d0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
121e0 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
121f0 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
12200 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
12210 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
12220 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
12230 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
12240 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
12250 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
12260 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
12270 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12280 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
12290 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
122a0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
122b0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
122c0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
122d0 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
122e0 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
122f0 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
12300 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
12310 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
12320 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
12330 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
12340 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
12350 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
12360 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
12370 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
12380 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
12390 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
123a0 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
123b0 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
123c0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
123d0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
123e0 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
123f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
12400 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
12410 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
12420 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
12430 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
12440 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12450 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
12460 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
12470 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
12480 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12490 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
124a0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
124b0 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
124c0 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69      u8 mallocFai
124d0 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
124e0 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69  Failed;.    sqli
124f0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
12500 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
12510 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
12520 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
12530 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
12540 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
12550 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
12560 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
12570 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  loc();.    db->m
12580 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
12590 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
125a0 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
125b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
125c0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
125d0 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  rc, 0);.  }.  re
125e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
125f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
12600 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
12610 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
12620 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
12630 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
12640 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
12650 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
12660 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
12670 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
12680 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
12690 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
126a0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
126b0 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
126c0 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
126d0 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
126e0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
126f0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
12700 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
12710 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
12720 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
12730 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
12740 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
12750 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
12760 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
12770 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12780 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
12790 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
127a0 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
127b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
127c0 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
127d0 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
127e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
127f0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
12800 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
12810 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
12820 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
12830 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
12840 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
12850 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
12860 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
12870 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
12880 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
12890 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
128a0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
128b0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
128c0 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
128d0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
128e0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
128f0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
12900 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
12910 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
12920 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
12930 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
12940 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
12950 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
12960 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
12970 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
12980 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
12990 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
129a0 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
129b0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
129c0 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
129d0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
129e0 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
129f0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
12a00 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
12a10 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
12a20 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
12a30 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
12a40 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
12a50 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
12a60 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
12a70 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
12a80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
12a90 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
12aa0 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
12ab0 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
12ac0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
12ad0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
12ae0 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
12af0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
12b00 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
12b10 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
12b20 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
12b30 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
12b40 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
12b50 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
12b60 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
12b70 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
12b80 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
12b90 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
12ba0 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
12bb0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
12bc0 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
12bd0 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
12be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
12bf0 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
12c00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12c10 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
12c20 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
12c30 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
12c40 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
12c50 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
12c60 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
12c70 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
12c80 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
12c90 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
12ca0 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
12cb0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
12cc0 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
12cd0 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
12ce0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
12cf0 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
12d00 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
12d10 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
12d20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
12d30 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
12d40 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
12d50 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
12d60 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
12d70 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
12d80 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
12d90 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
12da0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
12db0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
12dc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12dd0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
12de0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
12df0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
12e00 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
12e10 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
12e20 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
12e30 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
12e40 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
12e50 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
12e60 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
12e70 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
12e80 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
12e90 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
12ea0 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
12eb0 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
12ec0 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
12ed0 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
12ee0 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
12ef0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12f00 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
12f10 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
12f20 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
12f30 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
12f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
12f50 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
12f60 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
12f70 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
12f80 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
12f90 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
12fa0 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
12fb0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
12fc0 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
12fd0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
12fe0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
12ff0 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
13000 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
13010 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
13020 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
13030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
13040 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
13050 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
13060 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
13070 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
13080 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
13090 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
130a0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
130b0 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
130c0 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
130d0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
130e0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
130f0 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
13100 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
13110 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
13120 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
13130 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
13140 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
13150 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
13160 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
13170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13180 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
13190 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
131a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
131b0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
131c0 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
131d0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
131e0 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
131f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
13200 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
13210 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
13220 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
13230 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
13240 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
13250 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13260 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
13270 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
13280 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
13290 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
132a0 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
132b0 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
132c0 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
132d0 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
132e0 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
132f0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
13300 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
13310 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
13320 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
13330 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
13340 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
13350 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
13360 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
13370 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
13380 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
13390 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
133a0 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
133b0 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
133c0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
133d0 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
133e0 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
133f0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
13400 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
13410 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
13420 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
13430 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
13440 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
13450 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
13460 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
13470 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
13480 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
13490 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
134a0 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
134b0 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
134c0 72 61 6d 65 74 65 72 20 63 6f 72 72 73 70 6f 6e  rameter corrspon
134d0 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e  ds to bit 0 etc.
134e0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
134f0 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
13500 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ata(Vdbe *pVdbe,
13510 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
13520 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a  sk){.  AuxData *
13530 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41  *pp = &pVdbe->pA
13540 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28  uxData;.  while(
13550 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
13560 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
13570 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
13580 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
13590 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75  iOp==iOp && (pAu
135a0 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28  x->iArg>31 || !(
135b0 6d 61 73 6b 20 26 20 28 28 75 33 32 29 31 3c 3c  mask & ((u32)1<<
135c0 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20  pAux->iArg)))). 
135d0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
135e0 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
135f0 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
13600 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
13610 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
13620 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
13630 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
13640 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e  e3DbFree(pVdbe->
13650 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d  db, pAux);.    }
13660 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20  else{.      pp= 
13670 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  &pAux->pNext;.  
13680 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13690 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
136a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
136b0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
136c0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
136d0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65  rgument,.** exce
136e0 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74  pt for object it
136f0 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70  self, which is p
13700 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
13710 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
13720 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
13730 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
13740 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
13750 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
13760 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
13770 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
13780 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
13790 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
137a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
137b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66  connection and f
137c0 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20  rees the object 
137d0 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20  itself..*/.void 
137e0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
137f0 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
13800 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
13810 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
13820 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20  , *pNext;.  int 
13830 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
13840 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
13850 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
13860 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
13870 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
13880 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
13890 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
138a0 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
138b0 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70  N);.  for(pSub=p
138c0 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62  ->pProgram; pSub
138d0 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20  ; pSub=pNext){. 
138e0 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d     pNext = pSub-
138f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65  >pNext;.    vdbe
13900 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
13910 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d  pSub->aOp, pSub-
13920 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  >nOp);.    sqlit
13930 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
13940 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
13950 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30  p->nzVar-1; i>=0
13960 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62  ; i--) sqlite3Db
13970 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
13980 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65  r[i]);.  vdbeFre
13990 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
139a0 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
139b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
139c0 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  , p->aLabel);.  
139d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
139e0 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
139f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13a00 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
13a10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13a20 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66  , p->pFree);.#if
13a30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13a40 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
13a50 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62  AIN).  sqlite3Db
13a60 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70  Free(db, p->zExp
13a70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  lain);.  sqlite3
13a80 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45  DbFree(db, p->pE
13a90 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a  xplain);.#endif.
13aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
13ab0 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
13ac0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
13ad0 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
13ae0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
13af0 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  b;..  if( NEVER(
13b00 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
13b10 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
13b20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13b30 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
13b40 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
13b50 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
13b60 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20  t(db, p);.  if( 
13b70 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
13b80 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
13b90 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
13ba0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
13bb0 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
13bc0 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
13bd0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
13be0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
13bf0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
13c00 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
13c10 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
13c20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
13c30 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  D;.  p->db = 0;.
13c40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13c50 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
13c60 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
13c70 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
13c80 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
13c90 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
13ca0 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
13cb0 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
13cc0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
13cd0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
13ce0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
13cf0 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
13d00 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
13d10 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
13d20 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
13d30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
13d40 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
13d50 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
13d60 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
13d70 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
13d80 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
13d90 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
13da0 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
13db0 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
13dc0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
13dd0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
13de0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
13df0 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
13e00 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
13e10 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
13e20 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
13e30 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
13e40 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
13e50 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
13e60 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
13e70 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
13e80 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
13e90 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
13ea0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13eb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13ec0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
13ed0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
13ee0 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
13ef0 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
13f00 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
13f10 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
13f20 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
13f30 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
13f40 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
13f50 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
13f60 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
13f70 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
13f80 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
13f90 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
13fa0 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
13fb0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
13fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13fd0 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  p->lastRowid = p
13fe0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
13ff0 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29      if( res!=0 )
14000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14010 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14020 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
14030 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
14040 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
14050 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
14060 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
14070 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
14080 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
14090 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
140a0 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65  E_STALE;.  }else
140b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70   if( ALWAYS(p->p
140c0 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69  Cursor) ){.    i
140d0 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20  nt hasMoved;.   
140e0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
140f0 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
14100 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  oved(p->pCursor,
14110 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20   &hasMoved);.   
14120 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14130 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73   rc;.    if( has
14140 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70  Moved ){.      p
14150 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
14160 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
14170 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20     p->nullRow = 
14180 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
14190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
141a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
141b0 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
141c0 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
141d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
141e0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
141f0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
14200 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
14210 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
14220 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
14230 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
14240 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
14250 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
14260 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
14270 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
14280 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
14290 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
142a0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
142b0 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
142c0 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
142d0 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
142e0 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
142f0 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
14300 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
14310 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
14320 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
14330 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
14340 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
14350 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
14360 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
14370 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
14380 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
14390 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
143a0 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
143b0 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
143c0 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
143d0 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
143e0 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
143f0 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
14400 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
14410 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
14420 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
14430 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
14440 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
14450 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
14460 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
14470 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72   data blob separ
14480 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
14490 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
144a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
144b0 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
144c0 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
144d0 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
144e0 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
144f0 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
14500 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
14510 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
14520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
14530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
14540 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
14560 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
14570 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
14590 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
145a0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
145b0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
145c0 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
145d0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
145e0 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
14610 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
14620 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
14630 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
14640 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
14650 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
14680 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
14690 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
146b0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
146c0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
146d0 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
146e0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
146f0 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
14700 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14720 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
14730 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
14740 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
14760 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
14770 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
14780 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
147b0 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
147c0 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
147d0 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
147e0 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
147f0 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
14800 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
14810 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
14820 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
14830 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
14840 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
14850 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
14860 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
14870 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
14880 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
14890 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
148a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
148b0 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
148c0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
148d0 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
148e0 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
148f0 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
14900 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
14910 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
14920 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
14930 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
14940 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
14950 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
14960 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
14970 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
14980 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
14990 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
149a0 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
149b0 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
149c0 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
149d0 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
149e0 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
149f0 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
14a00 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
14a10 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
14a20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42    if( i<(-MAX_6B
14a30 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b  YTE) ) return 6;
14a40 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f  .      /* Previo
14a50 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73  us test prevents
14a60 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37  :  u = -(-922337
14a70 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a  2036854775808) *
14a80 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a  /.      u = -i;.
14a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14aa0 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
14ab0 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a    if( u<=127 ){.
14ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69        return ((i
14ad0 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
14ae0 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75  ormat>=4) ? 8+(u
14af0 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a  32)u : 1;.    }.
14b00 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
14b10 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
14b20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
14b30 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
14b40 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
14b50 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
14b60 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
14b70 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
14b80 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
14b90 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
14ba0 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
14bb0 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
14bc0 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
14bd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
14be0 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
14bf0 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
14c00 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
14c10 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
14c20 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
14c30 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
14c40 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
14c50 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
14c60 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
14c70 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
14c80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
14c90 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
14ca0 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
14cb0 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
14cc0 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
14cd0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
14ce0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
14cf0 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
14d00 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
14d10 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
14d20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
14d30 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
14d40 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
14d50 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
14d60 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
14d70 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
14d80 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
14d90 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
14da0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
14db0 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
14dc0 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
14dd0 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
14de0 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
14df0 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
14e00 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
14e10 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
14e20 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
14e30 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
14e40 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
14e50 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
14e60 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
14e70 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
14e80 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
14e90 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
14ea0 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
14eb0 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
14ec0 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
14ed0 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
14ee0 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
14ef0 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
14f00 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
14f10 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
14f20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
14f30 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
14f40 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
14f50 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
14f60 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
14f70 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
14f80 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
14f90 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
14fa0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
14fb0 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
14fc0 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
14fd0 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
14fe0 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
14ff0 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
15000 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
15010 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
15020 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
15030 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
15040 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
15050 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
15060 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
15070 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
15080 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
15090 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
150a0 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
150b0 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
150c0 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
150d0 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
150e0 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
150f0 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
15100 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
15110 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
15120 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
15130 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
15140 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
15150 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
15160 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
15170 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
15180 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
15190 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
151a0 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
151b0 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
151c0 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
151d0 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
151e0 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
151f0 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
15200 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
15210 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
15220 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
15230 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
15240 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
15250 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
15260 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
15270 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
15280 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
15290 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
152a0 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
152b0 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
152c0 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
152d0 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
152e0 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
152f0 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
15300 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
15310 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
15320 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
15330 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
15340 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
15350 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
15360 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
15370 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
15380 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
15390 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
153a0 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
153b0 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
153c0 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
153d0 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
153e0 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
153f0 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
15400 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
15410 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
15420 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
15430 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
15440 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
15450 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
15460 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
15470 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
15480 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
15490 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
154a0 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
154b0 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
154c0 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
154d0 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
154e0 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
154f0 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
15500 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
15510 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
15520 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
15530 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
15540 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
15550 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
15560 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
15570 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
15580 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
15590 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
155a0 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
155b0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
155c0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
155d0 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
155e0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
155f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
15600 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
15610 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
15620 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
15630 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
15640 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
15650 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
15660 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
15670 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
15680 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
15690 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
156a0 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
156b0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
156c0 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
156d0 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
156e0 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
156f0 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
15700 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
15710 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
15720 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
15730 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
15740 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
15750 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
15760 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
15770 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
15780 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
15790 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
157a0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
157b0 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
157c0 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
157d0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
157e0 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
157f0 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
15800 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
15810 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
15820 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
15830 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
15840 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
15850 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
15860 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
15870 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
15880 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
15890 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
158a0 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
158b0 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
158c0 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
158d0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
158e0 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
158f0 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
15900 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
15910 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
15920 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
15930 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
15940 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
15950 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
15960 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
15970 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
15980 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
15990 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
159a0 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
159b0 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
159c0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
159d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
159e0 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
159f0 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  ->r) );.      me
15a00 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
15a10 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
15a20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
15a30 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
15a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
15a50 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
15a60 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
15a70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
15a80 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
15a90 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
15aa0 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e  ert( len<=(u32)n
15ab0 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
15ac0 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
15ad0 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30  uf[i] = (u8)(v&0
15ae0 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
15af0 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
15b00 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
15b10 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
15b20 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
15b30 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
15b40 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
15b50 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
15b60 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
15b70 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
15b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
15b90 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
15ba0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
15bb0 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
15bc0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
15bd0 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
15be0 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
15bf0 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
15c00 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
15c10 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
15c20 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
15c30 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
15c40 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  m->u.nZero;.    
15c50 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d    assert( nBuf>=
15c60 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  0 );.      if( l
15c70 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29  en > (u32)nBuf )
15c80 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
15c90 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20  (u32)nBuf;.     
15ca0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
15cb0 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
15cc0 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
15cd0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
15ce0 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
15cf0 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
15d00 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
15d10 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
15d20 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
15d30 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
15d40 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
15d50 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
15d60 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
15d70 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
15d80 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
15d90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
15da0 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75  ytes read..*/ .u
15db0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
15dc0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
15dd0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15de0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
15df0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
15e00 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
15e10 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
15e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
15e30 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
15e40 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
15e50 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
15e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
15e70 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
15e80 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
15e90 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
15ea0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
15eb0 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
15ec0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
15ed0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
15ee0 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
15ef0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
15f00 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
15f10 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
15f20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15f30 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
15f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15f50 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
15f60 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
15f70 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
15f80 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
15f90 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
15fa0 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
15fb0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
15fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
15fd0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
15fe0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
15ff0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
16000 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
16010 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
16020 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
16030 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
16040 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16050 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
16060 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
16070 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
16080 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
16090 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
160a0 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
160b0 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
160c0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
160d0 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
160e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
160f0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
16100 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
16110 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
16120 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
16130 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
16140 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
16150 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
16160 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
16170 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
16180 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
16190 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
161a0 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
161b0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
161c0 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
161d0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
161e0 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
161f0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
16200 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
16210 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
16220 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
16230 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
16240 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
16250 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
16260 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
16270 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
16280 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
16290 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
162a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
162b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
162c0 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
162d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
162e0 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
162f0 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
16300 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
16310 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
16320 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
16330 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
16340 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
16350 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
16360 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
16370 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
16380 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
16390 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
163a0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
163b0 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
163c0 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
163d0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
163e0 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
163f0 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
16400 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
16410 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
16420 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
16430 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
16440 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
16450 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
16460 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
16470 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
16480 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
16490 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
164a0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
164b0 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
164c0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
164d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
164e0 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
164f0 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
16500 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
16510 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
16520 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
16530 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
16540 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
16550 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
16560 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
16570 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
16580 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
16590 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
165a0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
165b0 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
165c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
165d0 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
165e0 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
165f0 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
16600 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
16630 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
16640 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
16650 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
16660 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
16670 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
16680 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
16690 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
166a0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
166b0 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
166c0 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
166d0 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
166e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
166f0 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
16700 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
16710 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
16720 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
16730 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
16740 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
16750 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
16760 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16770 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
16780 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
16790 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
167a0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
167b0 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
167c0 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
167d0 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
167e0 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
167f0 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72    u32 len = (ser
16800 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
16810 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
16820 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
16830 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
16840 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
16850 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d  el = 0;.      pM
16860 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
16870 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
16880 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  ;.      return l
16890 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
168a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
168b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
168c0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
168d0 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
168e0 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
168f0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
16900 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
16910 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
16920 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
16930 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
16940 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
16950 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
16960 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
16970 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
16980 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
16990 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
169a0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
169b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
169c0 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
169d0 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
169e0 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
169f0 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
16a00 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
16a10 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
16a20 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
16a30 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
16a40 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
16a50 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
16a60 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
16a70 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
16a80 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
16a90 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
16aa0 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
16ab0 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
16ac0 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
16ad0 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
16ae0 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
16af0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
16b00 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
16b10 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
16b20 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
16b30 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
16b40 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
16b50 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
16b60 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
16b70 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
16b80 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
16b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
16ba0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
16bb0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
16bc0 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
16be0 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
16bf0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  vailable */.  in
16c00 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20  t szSpace,      
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16c20 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
16c30 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
16c40 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20  char **ppFree   
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c60 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73  /* OUT: Caller s
16c70 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20  hould free this 
16c80 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  pointer */.){.  
16c90 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
16ca0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
16cb0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
16cc0 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
16cd0 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20    int nOff;     
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70    /* Increment p
16d00 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f  Space by nOff to
16d10 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69   align it */.  i
16d20 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16d50 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a  s required for *
16d60 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61  p */..  /* We wa
16d70 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20  nt to shift the 
16d80 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75  pointer pSpace u
16d90 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  p such that it i
16da0 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 8-byte aligned
16db0 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20  ..  ** Thus, we 
16dc0 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  need to calculat
16dd0 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c  e a value, nOff,
16de0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37   between 0 and 7
16df0 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a  , to shift .  **
16e00 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61   it by.  If pSpa
16e10 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d  ce is already 8-
16e20 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f  byte aligned, nO
16e30 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  ff should be zer
16e40 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d  o..  */.  nOff =
16e50 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54   (8 - (SQLITE_PT
16e60 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29  R_TO_INT(pSpace)
16e70 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42   & 7)) & 7;.  nB
16e80 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
16e90 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
16ea0 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
16eb0 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
16ec0 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
16ed0 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66  Byte>szSpace+nOf
16ee0 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  f ){.    p = (Un
16ef0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
16f00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
16f10 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
16f20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46  nByte);.    *ppF
16f30 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b  ree = (char *)p;
16f40 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65  .    if( !p ) re
16f50 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
16f60 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
16f70 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63  edRecord*)&pSpac
16f80 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70  e[nOff];.    *pp
16f90 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Free = 0;.  }.. 
16fa0 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
16fb0 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
16fc0 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
16fd0 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
16fe0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
16ff0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
17000 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
17010 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
17020 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
17030 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b  nfo->nField + 1;
17040 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
17050 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
17060 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
17070 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
17080 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61  n pKey[], popula
17090 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63  te the .** Unpac
170a0 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
170b0 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
170c0 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
170d0 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a  ment with the.**
170e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
170f0 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e   decoded record.
17100 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
17110 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
17120 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
17130 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
17140 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
17150 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
17160 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
17170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17180 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
17190 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
171a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
171b0 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
171c0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
171d0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
171e0 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75   *p      /* Popu
171f0 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74  late this struct
17200 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ure before retur
17210 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ning. */.){.  co
17220 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17230 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
17240 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17250 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20  )pKey;.  int d; 
17260 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20  .  u32 idx;     
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
17290 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66  aKey[] to read f
172a0 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20  rom */.  u16 u; 
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
172d0 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
172e0 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
172f0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
17300 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66  p->aMem;..  p->f
17310 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65  lags = 0;.  asse
17320 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
17330 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
17340 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
17350 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
17360 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
17370 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
17380 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
17390 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  u<p->nField && d
173a0 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33  <=nKey ){.    u3
173b0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
173c0 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
173d0 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78  rint32(&aKey[idx
173e0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
173f0 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
17400 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
17410 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
17420 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
17430 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20   /* pMem->flags 
17440 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56  = 0; // sqlite3V
17450 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77  dbeSerialGet() w
17460 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72  ill set this for
17470 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   us */.    pMem-
17480 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
17490 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
174a0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
174b0 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
174c0 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
174d0 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20  em++;.    u++;. 
174e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
174f0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
17500 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
17510 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a  eld = u;.}../*.*
17520 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17530 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
17540 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
17550 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
17560 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
17570 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
17580 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
17590 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
175a0 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
175b0 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
175c0 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
175d0 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
175e0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
175f0 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
17600 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
17610 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
17620 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
17630 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
17640 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
17650 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
17660 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
17670 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
17680 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
17690 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
176a0 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65  Record..**.** Ke
176b0 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
176c0 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
176d0 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
176e0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a  er of fields..**
176f0 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65   The key with fe
17700 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73  wer fields is us
17710 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c  ually compares l
17720 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a  ess than the .**
17730 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f   longer key.  Ho
17740 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50  wever if the UNP
17750 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c  ACKED_INCRKEY fl
17760 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73  ags in pPKey2 is
17770 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20   set.** and the 
17780 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20  common prefixes 
17790 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
177a0 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
177b0 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66  n key2..** Or if
177c0 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41   the UNPACKED_MA
177d0 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20  TCH_PREFIX flag 
177e0 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70  is set and the p
177f0 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65  refixes are.** e
17800 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b  qual, then the k
17810 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  eys are consider
17820 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61  ed to be equal a
17830 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20  nd.** the parts 
17840 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  beyond the commo
17850 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e  n prefix are ign
17860 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
17870 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
17880 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
17890 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
178a0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
178b0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
178c0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
178d0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
178e0 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ey */.){.  u32 d
178f0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
17900 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
17910 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
17920 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
17930 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
17940 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
17950 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
17960 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
17970 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
17980 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17990 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
179a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
179b0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
179c0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
179d0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
179e0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
179f0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
17a00 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17a10 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
17a20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
17a30 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
17a40 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
17a50 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
17a60 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
17a70 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
17a80 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
17a90 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
17aa0 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
17ab0 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
17ac0 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
17ad0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
17ae0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
17af0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
17b00 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
17b10 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
17b20 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
17b30 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
17b40 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
17b50 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
17b60 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
17b70 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
17b80 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
17b90 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
17ba0 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
17bb0 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
17bc0 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
17bd0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
17be0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
17bf0 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
17c00 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
17c10 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
17c20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
17c30 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
17c40 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
17c50 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
17c60 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
17c70 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
17c80 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
17c90 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
17ca0 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
17cb0 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
17cc0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
17cd0 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
17ce0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
17cf0 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
17d00 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
17d10 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
17d20 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
17d30 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
17d40 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
17d50 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
17d60 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
17d70 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
17d80 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20  ey2->nField );. 
17d90 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
17da0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
17db0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   );.  while( idx
17dc0 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
17dd0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a  Key2->nField ){.
17de0 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
17df0 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
17e00 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
17e10 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
17e20 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
17e30 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
17e40 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
17e50 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
17e60 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
17e70 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
17e80 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
17e90 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
17ea0 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
17eb0 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
17ec0 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
17ed0 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
17ee0 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
17ef0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
17f00 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
17f10 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
17f20 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
17f30 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
17f40 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
17f50 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
17f60 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
17f70 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
17f80 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
17f90 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
17fa0 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
17fb0 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
17fc0 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
17fd0 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
17fe0 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
17ff0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18000 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
18010 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
18020 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
18030 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
18040 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
18050 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
18060 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
18070 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
18080 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
18090 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
180a0 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
180b0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
180c0 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
180d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
180e0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
180f0 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
18100 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
18110 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
18120 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
18130 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
18140 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
18150 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
18160 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
18170 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
18180 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
18190 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
181a0 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
181b0 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
181c0 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
181d0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
181e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  c;.    }.    i++
181f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ;.  }..  /* No m
18200 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
18210 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
18220 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
18230 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
18240 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
18250 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
18260 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
18270 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
18280 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
18290 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
182a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
182b0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
182c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
182d0 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
182e0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
182f0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
18300 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
18310 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
18320 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
18330 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
18340 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
18350 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43  al. If the UNPAC
18360 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a  KED_INCRKEY.  **
18370 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
18380 65 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65  en break the tie
18390 20 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79   by treating key
183a0 32 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a  2 as larger..  *
183b0 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44  * If the UPACKED
183c0 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c  _PREFIX_MATCH fl
183d0 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
183e0 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e  keys with common
183f0 20 70 72 65 66 69 78 65 73 0a 20 20 2a 2a 20 61   prefixes.  ** a
18400 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
18410 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68 65   be equal.  Othe
18420 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65  rwise, the longe
18430 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20 20  r key is the .  
18440 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69  ** larger.  As i
18450 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70  t happens, the p
18460 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79  PKey2 will alway
18470 73 20 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a  s be the longer.
18480 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73    ** if there is
18490 20 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20   a difference.. 
184a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
184b0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 4b  ==0 );.  if( pPK
184c0 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
184d0 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b  ACKED_INCRKEY ){
184e0 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20  .    rc = -1;.  
184f0 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
18500 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
18510 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20  ED_PREFIX_MATCH 
18520 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76 65 20  ){.    /* Leave 
18530 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65  rc==0 */.  }else
18540 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31   if( idx1<szHdr1
18550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
18560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18570 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  .}. ../*.** pCur
18580 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
18590 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
185a0 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
185b0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
185c0 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
185d0 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
185e0 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
185f0 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
18600 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
18610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
18620 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
18630 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
18640 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
18650 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
18660 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
18670 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
18680 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
18690 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
186a0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
186b0 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
186c0 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
186d0 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
186e0 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
186f0 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
18700 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
18710 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18720 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
18730 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
18740 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
18750 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
18760 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
18770 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
18780 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
18790 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
187a0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
187b0 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
187c0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
187d0 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
187e0 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  v;..  UNUSED_PAR
187f0 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f  AMETER(db);..  /
18800 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
18810 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
18820 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
18830 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
18840 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
18850 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
18860 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
18870 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
18880 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
18890 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
188a0 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
188b0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
188c0 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
188d0 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
188e0 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
188f0 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
18900 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
18910 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
18920 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18930 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
18940 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
18950 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
18960 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
18970 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
18980 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
18990 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20   );     /* pCur 
189a0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
189b0 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
189c0 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65  t fail */.  asse
189d0 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20  rt( (nCellKey & 
189e0 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d  SQLITE_MAX_U32)=
189f0 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29  =(u64)nCellKey )
18a00 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
18a10 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
18a20 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65  tent of the inde
18a30 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d  x entry */.  mem
18a40 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f  set(&m, 0, sizeo
18a50 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  f(m));.  rc = sq
18a60 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
18a70 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
18a80 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  int)nCellKey, 1,
18a90 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
18aa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
18ab0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69  .  }..  /* The i
18ac0 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20  ndex entry must 
18ad0 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61  begin with a hea
18ae0 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76  der size */.  (v
18af0 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
18b00 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29  (u8*)m.z, szHdr)
18b10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
18b20 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  Hdr==3 );.  test
18b30 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e  case( szHdr==m.n
18b40 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
18b50 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69  ly(szHdr<3 || (i
18b60 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b  nt)szHdr>m.n) ){
18b70 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
18b80 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
18b90 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61    }..  /* The la
18ba0 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
18bb0 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
18bc0 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65  an integer - the
18bd0 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72   ROWID..  ** Ver
18be0 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73  ify that the las
18bf0 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69  t entry really i
18c00 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f  s an integer. */
18c10 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
18c20 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
18c30 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
18c40 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
18c50 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b   typeRowid==1 );
18c60 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
18c70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74  eRowid==2 );.  t
18c80 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
18c90 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  id==3 );.  testc
18ca0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
18cb0 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
18cc0 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b   typeRowid==5 );
18cd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
18ce0 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74  eRowid==6 );.  t
18cf0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
18d00 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63  id==8 );.  testc
18d10 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
18d20 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  9 );.  if( unlik
18d30 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20  ely(typeRowid<1 
18d40 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c  || typeRowid>9 |
18d50 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20  | typeRowid==7) 
18d60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
18d70 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
18d80 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
18d90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
18da0 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
18db0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
18dc0 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
18dd0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
18de0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
18df0 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
18e00 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
18e10 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
18e20 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
18e30 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
18e40 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
18e50 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
18e60 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
18e70 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
18e80 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
18e90 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
18ea0 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
18eb0 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
18ec0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
18ed0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
18ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
18ef0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
18f00 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
18f10 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
18f20 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
18f30 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
18f40 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
18f50 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
18f60 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
18f70 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
18f80 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
18f90 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20  e( m.zMalloc!=0 
18fa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18fb0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
18fc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18fd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a  CORRUPT_BKPT;.}.
18fe0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
18ff0 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
19000 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
19010 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
19020 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a  ting to against.
19030 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
19040 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  g in pUnpacked. 
19050 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
19060 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
19070 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
19080 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
19090 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
190a0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
190b0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
190c0 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52  an pUnpacked.  R
190d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
190e0 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
190f0 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65  * pUnpacked is e
19100 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
19110 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
19120 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
19130 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
19140 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
19150 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
19160 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
19170 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
19180 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
19190 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
191a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
191b0 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
191c0 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
191d0 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
191e0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
191f0 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
19200 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
19210 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
19220 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72  mpare(.  VdbeCur
19230 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
19240 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
19250 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
19260 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63  ainst */.  Unpac
19270 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61  kedRecord *pUnpa
19280 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b  cked,  /* Unpack
19290 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65  ed version of ke
192a0 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  y to compare aga
192b0 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72  inst */.  int *r
192c0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
192d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
192e0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
192f0 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
19300 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
19310 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
19320 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
19330 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
19340 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74  Mem m;..  assert
19350 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
19360 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
19370 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) );.  VVA_ONLY(
19380 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
19390 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
193a0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
193b0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
193c0 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75  _OK );    /* pCu
193d0 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
193e0 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
193f0 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a  not fail */.  /*
19400 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61   nCellKey will a
19410 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e  lways be between
19420 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66   0 and 0xfffffff
19430 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  f because of the
19440 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62   say.  ** that b
19450 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
19460 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65  () and sqlite3Ge
19470 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20  tVarint32() are 
19480 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20  implemented */. 
19490 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
194a0 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37   || nCellKey>0x7
194b0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a  fffffff ){.    *
194c0 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
194d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
194e0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d  PT_BKPT;.  }.  m
194f0 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
19500 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20  eof(m));.  rc = 
19510 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
19520 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
19530 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  sor, 0, (int)nCe
19540 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
19550 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
19560 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
19570 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65  assert( pUnpacke
19580 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  d->flags & UNPAC
19590 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
195a0 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c   );.  *res = sql
195b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
195c0 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
195d0 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
195e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
195f0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
19600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19610 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19620 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
19630 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
19640 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
19650 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
19660 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
19670 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
19680 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
19690 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
196a0 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
196b0 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
196c0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
196d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
196e0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
196f0 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
19700 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
19710 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
19720 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
19730 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
19740 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
19750 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
19760 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
19770 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
19780 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
19790 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
197a0 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
197b0 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
197c0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
197d0 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
197e0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
197f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
19800 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
19810 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
19820 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
19830 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
19840 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
19850 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
19860 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
19870 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
19880 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
19890 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
198a0 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
198b0 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
198c0 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
198d0 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
198e0 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
198f0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
19900 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
19910 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
19920 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
19930 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
19940 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
19950 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
19960 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
19970 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
19980 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
19990 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
199a0 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
199b0 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
199c0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
199d0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
199e0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
199f0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
19a00 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
19a10 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
19a20 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
19a30 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
19a40 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
19a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19a60 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
19a70 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
19a80 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
19a90 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
19aa0 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
19ab0 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
19ac0 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
19ad0 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
19ae0 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
19af0 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
19b00 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
19b10 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
19b20 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
19b30 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
19b40 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
19b50 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
19b60 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
19b70 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
19b80 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
19b90 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
19ba0 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
19bb0 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
19bc0 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
19bd0 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
19be0 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
19bf0 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
19c00 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
19c10 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
19c20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
19c30 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
19c40 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
19c50 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
19c60 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
19c70 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
19c80 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
19c90 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
19ca0 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
19cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19cc0 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
19cd0 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
19ce0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
19cf0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
19d00 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
19d10 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20  _UTF8);.        
19d20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
19d30 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70  oreType((Mem *)p
19d40 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ret);.      }.  
19d50 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
19d60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19d70 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
19d80 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
19d90 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
19da0 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
19db0 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
19dc0 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
19dd0 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
19de0 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
19df0 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
19e00 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
19e10 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
19e20 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
19e30 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
19e40 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
19e50 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
19e60 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
19e70 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20  f( iVar>32 ){.  
19e80 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30    v->expmask = 0
19e90 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
19ea0 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
19eb0 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
19ec0 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
19ed0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19ee0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
19ef0 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  BLE./*.** Transf
19f00 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  er error message
19f10 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71   text from an sq
19f20 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d  lite3_vtab.zErrM
19f30 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
19f40 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
19f50 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
19f60 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20  e3_malloc) into 
19f70 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28  a Vdbe.zErrMsg (
19f80 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
19f90 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
19fa0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
19fb0 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64  Malloc)..*/.void
19fc0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
19fd0 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70  rtErrmsg(Vdbe *p
19fe0 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  , sqlite3_vtab *
19ff0 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65  pVtab){.  sqlite
1a000 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
1a010 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a020 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
1a030 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
1a040 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1a050 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  b, pVtab->zErrMs
1a060 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  g);.  sqlite3_fr
1a070 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
1a080 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72  g);.  pVtab->zEr
1a090 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  rMsg = 0;.}.#end
1a0a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1a0b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1a0c0 2f 0a                                            /.