/ Hex Artifact Content
Login

Artifact 648f72365268979e89cd2ba8e5f2b4ecb1843fb0:


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 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20  _NextIfOpen:.   
32a0: 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65     case OP_Sorte
32b0: 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20  rNext: {.       
32c0: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
32d0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
32e0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 4f  Next;.        pO
32f0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41  p->p4type = P4_A
3300: 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20  DVANCE;.        
3310: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3320: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
3330: 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  v:.      case OP
3340: 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20  _PrevIfOpen: {. 
3350: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78         pOp->p4.x
3360: 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65  Advance = sqlite
3370: 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b 0a  3BtreePrevious;.
3380: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74          pOp->p4t
3390: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45  ype = P4_ADVANCE
33a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
33b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
33c0: 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73      pOp->opflags
33d0: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
33e0: 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d  Property[opcode]
33f0: 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e  ;.    if( (pOp->
3400: 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f  opflags & OPFLG_
3410: 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d  JUMP)!=0 && pOp-
3420: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  >p2<0 ){.      a
3430: 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70  ssert( -1-pOp->p
3440: 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  2<p->nLabel );. 
3450: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61       pOp->p2 = a
3460: 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32  Label[-1-pOp->p2
3470: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  ];.    }.  }.  s
3480: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
3490: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
34a0: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
34b0: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  .  *pMaxFuncArgs
34c0: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61   = nMaxArgs;.  a
34d0: 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
34e0: 64 65 72 21 3d 30 20 7c 7c 20 70 2d 3e 62 74 72  der!=0 || p->btr
34f0: 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a 7d 0a 0a  eeMask==0 );.}..
3500: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3510: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3520: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
3530: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
3540: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
3550: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
3560: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
3570: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
3580: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
3590: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
35a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
35b0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
35c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35d0: 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65   array of opcode
35e0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
35f0: 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61  h.** the Vdbe pa
3600: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
3610: 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69  t argument. It i
3620: 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
3630: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
3640: 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74  to arrange for t
3650: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61  he returned arra
3660: 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c  y to be eventual
3670: 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74  ly freed using t
3680: 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f  he .** vdbeFreeO
3690: 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f  pArray() functio
36a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  n..**.** Before 
36b0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70  returning, *pnOp
36c0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
36d0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
36e0: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
36f0: 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c  .** array. Also,
3700: 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65   *pnMaxArg is se
3710: 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20  t to the larger 
3720: 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  of its current v
3730: 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65  alue and .** the
3740: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
3750: 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  es in the Vdbe.a
3760: 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71  pArg[] array req
3770: 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65  uired to execute
3780: 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65   the .** returne
3790: 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64  d program..*/.Vd
37a0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
37b0: 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62  eTakeOpArray(Vdb
37c0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c  e *p, int *pnOp,
37d0: 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b   int *pnMaxArg){
37e0: 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d  .  VdbeOp *aOp =
37f0: 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72   p->aOp;.  asser
3800: 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62  t( aOp && !p->db
3810: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3820: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
3830: 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  at sqlite3VdbeUs
3840: 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f  esBtree() was no
3850: 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  t called on this
3860: 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   VM */.  assert(
3870: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30   p->btreeMask==0
3880: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
3890: 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41  Values(p, pnMaxA
38a0: 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70  rg);.  *pnOp = p
38b0: 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20  ->nOp;.  p->aOp 
38c0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f  = 0;.  return aO
38d0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
38e0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
38f0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
3900: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
3910: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
3920: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
3930: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
3940: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
3950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3960: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
3970: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
3980: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
3990: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
39a0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
39b0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
39c0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
39d0: 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  nOp > p->nOpAllo
39e0: 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79  c && growOpArray
39f0: 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (p) ){.    retur
3a00: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
3a10: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
3a20: 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b  ALWAYS(nOp>0) ){
3a30: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3a40: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3a50: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
3a60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
3a70: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
3a80: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
3a90: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
3aa0: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
3ab0: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
3ac0: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
3ad0: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
3ae0: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
3af0: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
3b00: 28 20 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( p2<0 ){.      
3b10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3b20: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3b30: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20  pOut->opcode] & 
3b40: 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20  OPFLG_JUMP );.  
3b50: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
3b60: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
3b70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3b80: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3b90: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
3ba0: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
3bb0: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
3bc0: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
3bd0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
3be0: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
3bf0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
3c00: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
3c10: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
3c20: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70  COMMENTS.      p
3c30: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  Out->zComment = 
3c40: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
3c50: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
3c60: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
3c70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
3c80: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3c90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3ca0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
3cb0: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
3cc0: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3cd0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3ce0: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3cf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
3d00: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
3d10: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3d20: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
3d30: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3d40: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3d50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3d60: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3d70: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3d80: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3d90: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3da0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3db0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3dc0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3dd0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3de0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3df0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3e00: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
3e10: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
3e20: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3e30: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
3e40: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
3e50: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3e60: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
3e70: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3e80: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3e90: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
3ea0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3eb0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3ec0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3ed0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
3ee0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
3ef0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
3f00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3f10: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
3f20: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
3f30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3f40: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
3f50: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
3f60: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3f70: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
3f80: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3f90: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3fa0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
3fb0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3fc0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
3fd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3fe0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
3ff0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4000: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4010: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4020: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4030: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4040: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4050: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4060: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4070: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4080: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4090: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
40a0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
40b0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
40c0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
40d0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
40e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
40f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4100: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
4110: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4120: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
4130: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4140: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4150: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4160: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4170: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4180: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4190: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
41a0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
41b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
41c0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
41d0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20  nt addr){.  if( 
41e0: 41 4c 57 41 59 53 28 61 64 64 72 3e 3d 30 29 20  ALWAYS(addr>=0) 
41f0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
4200: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
4210: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
4220: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
4230: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
4240: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
4250: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
4260: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
4270: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
4280: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
4290: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
42a0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
42b0: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
42c0: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
42d0: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
42e0: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
42f0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
4300: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
4310: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4320: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
4330: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
4340: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4350: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
4360: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
4370: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
4380: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
4390: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
43a0: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
43b0: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
43c0: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
43d0: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
43e0: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
43f0: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
4400: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
4410: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
4420: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
4430: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
4440: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4450: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
4460: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4470: 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20  e(db, p4);.     
4480: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4490: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
44a0: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
44b0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
44c0: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
44d0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
44e0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
44f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4510: 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a  e P4_MPRINTF: {.
4520: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
4530: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
4540: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
4550: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
4560: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4570: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
4580: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
4590: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
45a0: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
45b0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
45c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
45d0: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
45e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
45f0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4600: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
4610: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
4620: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
4630: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
4640: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  e{.          Mem
4650: 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a   *p = (Mem*)p4;.
4660: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4670: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
4680: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
4690: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
46a0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
46b0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
46c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
46d0: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b  case P4_VTAB : {
46e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
46f0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4700: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
4710: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
4720: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
4730: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4740: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
4750: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  ee the space all
4760: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61  ocated for aOp a
4770: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73  nd any p4 values
4780: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
4790: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f  he.** opcodes co
47a0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20  ntained within. 
47b0: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55  If aOp is not NU
47c0: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  LL it is assumed
47d0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20   to contain .** 
47e0: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f  nOp entries. .*/
47f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
4800: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
4810: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f  ite3 *db, Op *aO
4820: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69  p, int nOp){.  i
4830: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70  f( aOp ){.    Op
4840: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70   *pOp;.    for(p
4850: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70  Op=aOp; pOp<&aOp
4860: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20  [nOp]; pOp++){. 
4870: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
4880: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
4890: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
48a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
48b0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
48c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
48d0: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
48e0: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
48f0: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73    .    }.  }.  s
4900: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4910: 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOp);.}../*.** 
4920: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67  Link the SubProg
4930: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ram object passe
4940: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
4950: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68  argument into th
4960: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74  e linked.** list
4970: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f   at Vdbe.pSubPro
4980: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20  gram. This list 
4990: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74  is used to delet
49a0: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61  e all sub-progra
49b0: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65  m.** objects whe
49c0: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c  n the VM is no l
49d0: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
49e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
49f0: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61  dbeLinkSubProgra
4a00: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  m(Vdbe *pVdbe, S
4a10: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20  ubProgram *p){. 
4a20: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62   p->pNext = pVdb
4a30: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  e->pProgram;.  p
4a40: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  Vdbe->pProgram =
4a50: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   p;.}../*.** Cha
4a60: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61  nge the opcode a
4a70: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e  t addr into OP_N
4a80: 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  oop.*/.void sqli
4a90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
4aa0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
4ab0: 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70 2d   addr){.  if( p-
4ac0: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
4ad0: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
4ae0: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
4af0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4b00: 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c  ;.    freeP4(db,
4b10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4b20: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65  p->p4.p);.    me
4b30: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
4b40: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
4b50: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
4b60: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28  OP_Noop;.    if(
4b70: 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20   addr==p->nOp-1 
4b80: 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a  ) p->nOp--;.  }.
4b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4ba0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4bb0: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
4bc0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
4bd0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4be0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
4bf0: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
4c00: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
4c10: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4c20: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4c30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4c40: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
4c50: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
4c60: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
4c70: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
4c80: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
4c90: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4ca0: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4cb0: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4cc0: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4cd0: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4ce0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4cf0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4d00: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4d10: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4d20: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4d30: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4d40: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
4d50: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
4d60: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
4d70: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
4d80: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
4d90: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41  ues of n (P4_STA
4da0: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20  TIC, P4_COLLSEQ 
4db0: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
4dc0: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a  hat zP4 points.*
4dd0: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
4de0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
4df0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
4e00: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
4e10: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
4e20: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
4e30: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
4e40: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
4e50: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
4e60: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
4e70: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
4e80: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
4e90: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
4ea0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4eb0: 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20  beChangeP4(Vdbe 
4ec0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
4ed0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69  nst char *zP4, i
4ee0: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
4ef0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
4f00: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4f10: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
4f20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
4f30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
4f40: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
4f50: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp==0 || db->m
4f60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4f70: 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41     if( n!=P4_VTA
4f80: 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  B ){.      freeP
4f90: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4fa0: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4fb0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4fc0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4fd0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
4fe0: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
4ff0: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
5000: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
5010: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
5020: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
5030: 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72 74 28  addr];.  assert(
5040: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
5050: 5f 4e 4f 54 55 53 45 44 20 7c 7c 20 70 4f 70 2d  _NOTUSED || pOp-
5060: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
5070: 32 20 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62  2 );.  freeP4(db
5080: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5090: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
50a0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
50b0: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
50c0: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
50d0: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
50e0: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
50f0: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
5100: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
5110: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
5120: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
5130: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
5140: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
5150: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
5160: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5170: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
5180: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
5190: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
51a0: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
51b0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
51c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
51d0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
51e0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
51f0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5200: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5210: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
5220: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
5230: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5240: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5250: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5260: 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71   P4_VTAB;.    sq
5270: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
5280: 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20  Table *)zP4);.  
5290: 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62    assert( ((VTab
52a0: 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70  le *)zP4)->db==p
52b0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20  ->db );.  }else 
52c0: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
52d0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
52e0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
52f0: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
5300: 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65   char)n;.  }else
5310: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
5320: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
5330: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
5340: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
5350: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
5360: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
5370: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5380: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
5390: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
53a0: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
53b0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63  cently added opc
53c0: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  ode to the KeyIn
53d0: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  fo for the.** in
53e0: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  dex given..*/.vo
53f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
5400: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  tP4KeyInfo(Parse
5410: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
5420: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a  *pIdx){.  Vdbe *
5430: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5440: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
5450: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5460: 49 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Idx!=0 );.  sqli
5470: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
5480: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71  v, -1, (char*)sq
5490: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
54a0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78  dex(pParse, pIdx
54b0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
54c0: 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
54d0: 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  NFO);.}..#ifdef 
54e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
54f0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f  PLAIN_COMMENTS./
5500: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5510: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
5520: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
5530: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
5540: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
5550: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
5560: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
5570: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
5580: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
5590: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
55a0: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
55b0: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
55c0: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
55d0: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
55e0: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
55f0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
5600: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5620: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
5630: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5640: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
5650: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5660: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
5670: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5680: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
5690: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
56a0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
56b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56c0: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
56d0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
56e0: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
56f0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
5700: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
5710: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
5720: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
5730: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
5740: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
5750: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
5760: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5770: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5780: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5790: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
57a0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
57b0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
57c0: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
57d0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
57e0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
57f0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
5800: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
5810: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
5820: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5830: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5840: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
5850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
5860: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
5870: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5880: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
5890: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
58a0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
58b0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
58c0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
58d0: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UG */../*.** Ret
58e0: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
58f0: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
5900: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
5910: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
5920: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
5930: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5940: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
5950: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
5960: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
5970: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
5980: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
5990: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
59a0: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
59b0: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
59c0: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
59d0: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
59e0: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
59f0: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
5a00: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
5a10: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
5a20: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
5a30: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
5a40: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
5a50: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
5a60: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
5a70: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
5a80: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
5a90: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ut having to che
5aa0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5ab0: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a   return from .**
5ac0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5ad0: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
5ae0: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
5af0: 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20  he dummy.opcode 
5b00: 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77  is 0,.** dummy w
5b10: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69  ill never be wri
5b20: 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69  tten to.  This i
5b30: 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f  s verified by co
5b40: 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e  de inspection an
5b50: 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20  d.** by running 
5b60: 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a  with Valgrind..*
5b70: 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23  *.** About the #
5b80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5b90: 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c  T_TRACE:  Normal
5ba0: 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ly, this routine
5bb0: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
5bc0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f  .** unless p->nO
5bd0: 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62 65  p>0.  This is be
5be0: 63 61 75 73 65 20 69 6e 20 74 68 65 20 61 62 73  cause in the abs
5bf0: 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  ense of SQLITE_O
5c00: 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e  MIT_TRACE,.** an
5c10: 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75   OP_Trace instru
5c20: 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ction is always 
5c30: 69 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c 69  inserted by sqli
5c40: 74 65 33 56 64 62 65 47 65 74 28 29 20 61 73 20  te3VdbeGet() as 
5c50: 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77  soon as.** a new
5c60: 20 56 44 42 45 20 69 73 20 63 72 65 61 74 65 64   VDBE is created
5c70: 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66 72 65  .  So we are fre
5c80: 65 20 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f  e to set addr to
5c90: 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75   p->nOp-1 withou
5ca0: 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64  t.** having to d
5cb0: 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d  ouble-check to m
5cc0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5cd0: 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d  e result is non-
5ce0: 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a  negative. But.**
5cf0: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
5d00: 54 52 41 43 45 20 69 73 20 64 65 66 69 6e 65 64  TRACE is defined
5d10: 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69  , the OP_Trace i
5d20: 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65  s omitted and we
5d30: 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63   do need to.** c
5d40: 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f  heck the value o
5d50: 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72  f p->nOp-1 befor
5d60: 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f  e continuing..*/
5d70: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
5d80: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
5d90: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
5da0: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
5db0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
5dc0: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
5dd0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
5de0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
5df0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
5e00: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
5e10: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
5e20: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
5e30: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
5e40: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
5e50: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
5e60: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
5e70: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
5e80: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
5e90: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
5ea0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
5eb0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
5ec0: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69  OMIT_TRACE.    i
5ed0: 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72  f( p->nOp==0 ) r
5ee0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
5ef0: 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20  dummy;.#endif.  
5f00: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
5f10: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
5f20: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
5f30: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
5f40: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5f50: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
5f60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5f70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
5f80: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
5f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
5fa0: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
5fb0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
5fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
5fd0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
5fe0: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NTS)./*.** Retur
5ff0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  n an integer val
6000: 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ue for one of th
6010: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
6020: 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a  the opcode pOp.*
6030: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
6040: 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a  character c..*/.
6050: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
6060: 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f  lateP(char c, co
6070: 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  nst Op *pOp){.  
6080: 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74  if( c=='1' ) ret
6090: 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  urn pOp->p1;.  i
60a0: 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75  f( c=='2' ) retu
60b0: 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66  rn pOp->p2;.  if
60c0: 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72  ( c=='3' ) retur
60d0: 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  n pOp->p3;.  if(
60e0: 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e   c=='4' ) return
60f0: 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65   pOp->p4.i;.  re
6100: 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a  turn pOp->p5;.}.
6110: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
6120: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
6130: 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20  "comment" field 
6140: 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65  of a VDBE opcode
6150: 20 6c 69 73 74 69 6e 67 0a 2a 2f 0a 73 74 61 74   listing.*/.stat
6160: 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f  ic int displayCo
6170: 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f  mment(.  const O
6180: 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54  p *pOp,     /* T
6190: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20  he opcode to be 
61a0: 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63  commented */.  c
61b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
61c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20    /* Previously 
61d0: 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66  obtained value f
61e0: 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20  or P4 */.  char 
61f0: 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a  *zTemp,       /*
6200: 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65   Write result he
6210: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d  re */.  int nTem
6220: 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  p          /* Sp
6230: 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ace available in
6240: 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20   zTemp[] */.){. 
6250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
6260: 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Name;.  const ch
6270: 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20  ar *zSynopsis;. 
6280: 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20   int nOpName;.  
6290: 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f  int ii, jj;.  zO
62a0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  pName = sqlite3O
62b0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
62c0: 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d  pcode);.  nOpNam
62d0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
62e0: 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20  n30(zOpName);.  
62f0: 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e  if( zOpName[nOpN
6300: 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e  ame+1] ){.    in
6310: 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20  t seenCom = 0;. 
6320: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a     char c;.    z
6330: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61  Synopsis = zOpNa
6340: 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20  me += nOpName + 
6350: 31 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a  1;.    for(ii=jj
6360: 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26  =0; jj<nTemp-1 &
6370: 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73  & (c = zSynopsis
6380: 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b  [ii])!=0; ii++){
6390: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50  .      if( c=='P
63a0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
63b0: 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d   zSynopsis[++ii]
63c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
63d0: 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='4' ){.        
63e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
63f0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
6400: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34  mp+jj, "%s", zP4
6410: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
6420: 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20   if( c=='X' ){. 
6430: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6440: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
6450: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
6460: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
6470: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  t);.          se
6480: 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20  enCom = 1;.     
6490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
64a0: 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61      int v1 = tra
64b0: 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b  nslateP(c, pOp);
64c0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
64d0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  2;.          sql
64e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
64f0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6500: 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20  , "%d", v1);.   
6510: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
6520: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
6530: 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29  1, "@P", 2)==0 )
6540: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
6550: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
6560: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
6570: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
6580: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j);.            
6590: 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v2 = translateP(
65a0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70  zSynopsis[ii], p
65b0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Op);.           
65c0: 20 69 66 28 20 76 32 3e 31 20 29 20 73 71 6c 69   if( v2>1 ) sqli
65d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
65e0: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
65f0: 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31   "..%d", v1+v2-1
6600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
6610: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
6620: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
6630: 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20  ..P3", 4)==0 && 
6640: 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20  pOp->p3==0 ){.  
6650: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
6660: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
6670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6680: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
6690: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
66a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
66b0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b         zTemp[jj+
66c0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
66d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
66e0: 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65  eenCom && jj<nTe
66f0: 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f  mp-5 && pOp->zCo
6700: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  mment ){.      s
6710: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6720: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
6730: 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d  jj, "; %s", pOp-
6740: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
6750: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
6760: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
6770: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6780: 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d   jj<nTemp ) zTem
6790: 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  p[jj] = 0;.  }el
67a0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d  se if( pOp->zCom
67b0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
67c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
67d0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c  mp, zTemp, "%s",
67e0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
67f0: 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65  .    jj = sqlite
6800: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29  3Strlen30(zTemp)
6810: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
6820: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
6830: 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   jj = 0;.  }.  r
6840: 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64  eturn jj;.}.#end
6850: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
6860: 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66  UG */...#if !def
6870: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6880: 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65  _EXPLAIN) || !de
6890: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a  fined(NDEBUG) \.
68a0: 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28       || defined(
68b0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
68c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
68d0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d  DEBUG)./*.** Com
68e0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
68f0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
6900: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
6910: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
6920: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
6930: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
6940: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
6950: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
6960: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
6970: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
6980: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
6990: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
69a0: 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  mp;.  assert( nT
69b0: 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69  emp>=20 );.  swi
69c0: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
69d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
69e0: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
69f0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
6a00: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
6a10: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
6a20: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73  yInfo;.      ass
6a30: 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
6a40: 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
6a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6a60: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6a70: 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65  emp, "k(%d", pKe
6a80: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a  yInfo->nField);.
6a90: 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65        i = sqlite
6aa0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29  3Strlen30(zTemp)
6ab0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
6ac0: 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   j<pKeyInfo->nFi
6ad0: 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  eld; j++){.     
6ae0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6af0: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
6b00: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
6b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
6b20: 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c  l = pColl ? pCol
6b30: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22  l->zName : "nil"
6b40: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
6b50: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6b60: 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  0(zColl);.      
6b70: 20 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65    if( n==6 && me
6b80: 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41  mcmp(zColl,"BINA
6b90: 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20  RY",6)==0 ){.   
6ba0: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22         zColl = "
6bb0: 42 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20  B";.          n 
6bc0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
6bd0: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
6be0: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
6bf0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
6c00: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
6c10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6c20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6c30: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6c40: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ',';.        if(
6c50: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
6c60: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
6c70: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6c80: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
6c90: 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  }.        memcpy
6ca0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c  (&zTemp[i], zCol
6cb0: 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, n+1);.       
6cc0: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   i += n;.      }
6cd0: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b  .      zTemp[i++
6ce0: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a  ] = ')';.      z
6cf0: 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Temp[i] = 0;.   
6d00: 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65     assert( i<nTe
6d10: 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  mp );.      brea
6d20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6d30: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
6d40: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6d50: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
6d60: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
6d70: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6d80: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32  mp, zTemp, "(%.2
6d90: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
6da0: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
6db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6dc0: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
6dd0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
6de0: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
6df0: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
6e00: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6e10: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
6e20: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
6e30: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
6e40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6e50: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
6e60: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
6e70: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6e80: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
6e90: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
6ea0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6eb0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6ec0: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
6ed0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6ee0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6ef0: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
6f00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6f10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6f20: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
6f30: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6f40: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
6f50: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
6f60: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
6f70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6f80: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
6f90: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
6fa0: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
6fb0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
6fc0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
6fd0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
6fe0: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
6ff0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
7000: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
7010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7020: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7030: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70  zTemp, "%lld", p
7040: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
7050: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
7060: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
7070: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
7080: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7090: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
70a0: 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20  6g", pMem->r);. 
70b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
70c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
70d0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Null ){.       
70e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
70f0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7100: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d  "NULL");.      }
7110: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7120: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
7130: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
7140: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28          zP4 = "(
7150: 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a  blob)";.      }.
7160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7170: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
7180: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7190: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
71a0: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
71b0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
71c0: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
71d0: 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  b->pVtab;.      
71e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
71f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7200: 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74  vtab:%p:%p", pVt
7210: 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  ab, pVtab->pModu
7220: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
7230: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
7240: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
7250: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAY: {.      sql
7260: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7270: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74  emp, zTemp, "int
7280: 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62  array");.      b
7290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
72a0: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
72b0: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
72c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
72d0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67  mp, zTemp, "prog
72e0: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
72f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7300: 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b  se P4_ADVANCE: {
7310: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  .      zTemp[0] 
7320: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
7330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
7340: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
7350: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
7360: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29      if( zP4==0 )
7370: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
7380: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
7390: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
73a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
73b0: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
73c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
73d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
73e0: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
73f0: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
7400: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
7410: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
7420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70  ..**.** The prep
7430: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
7440: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20  need to know in 
7450: 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70  advance the comp
7460: 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61  lete set of.** a
7470: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
7480: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  s that will be u
7490: 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  se.  A mask of t
74a0: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
74b0: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
74c0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e  in p->btreeMask.
74d0: 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73    The p->lockMas
74e0: 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  k value is the s
74f0: 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62  ubset of.** p->b
7500: 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61  treeMask of data
7510: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
7520: 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a  require a lock..
7530: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7540: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
7550: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
7560: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
7570: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
7580: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44  i<(int)sizeof(yD
7590: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
75a0: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
75b0: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
75c0: 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65  )*8 );.  p->btre
75d0: 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61  eMask |= ((yDbMa
75e0: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20  sk)1)<<i;.  if( 
75f0: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
7600: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
7610: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
7620: 29 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61  ){.    p->lockMa
7630: 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29  sk |= ((yDbMask)
7640: 31 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  1)<<i;.  }.}..#i
7650: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7660: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
7670: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
7680: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
7690: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
76a0: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
76b0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
76c0: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
76d0: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
76e0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
76f0: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
7700: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
7710: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
7720: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
7730: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
7740: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
7750: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
7760: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
7770: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
7780: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
7790: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
77a0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
77b0: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
77c0: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
77d0: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
77e0: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
77f0: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
7800: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
7810: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
7820: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
7830: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
7840: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
7850: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
7860: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
7870: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
7880: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
7890: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
78a0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
78b0: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
78c0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
78d0: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
78e0: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
78f0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
7900: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
7910: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
7920: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
7930: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
7940: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
7950: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
7960: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
7970: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
7980: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
7990: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
79a0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
79b0: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
79c0: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
79d0: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
79e0: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
79f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
7a00: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
7a10: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
7a20: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
7a30: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
7a40: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
7a50: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
7a60: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
7a70: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
7a80: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
7a90: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
7aa0: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
7ab0: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
7ac0: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
7ad0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
7ae0: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
7af0: 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d  f( p->lockMask==
7b00: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
7b10: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7b20: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
7b30: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
7b40: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
7b50: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  b;.  for(i=0, ma
7b60: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
7b70: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
7b80: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
7b90: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b   (mask & p->lock
7ba0: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
7bb0: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
7bc0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7bd0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62  e3BtreeEnter(aDb
7be0: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
7bf0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
7c00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7c10: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
7c20: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
7c30: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
7c40: 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20  * Unlock all of 
7c50: 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69  the btrees previ
7c60: 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20  ously locked by 
7c70: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
7c80: 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f  3VdbeEnter()..*/
7c90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7ca0: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
7cb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d  .  int i;.  yDbM
7cc0: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69  ask mask;.  sqli
7cd0: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
7ce0: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
7cf0: 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   if( p->lockMask
7d00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
7d10: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7d20: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
7d30: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
7d40: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
7d50: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  nDb;.  for(i=0, 
7d60: 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69  mask=1; i<nDb; i
7d70: 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b  ++, mask += mask
7d80: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
7d90: 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f  && (mask & p->lo
7da0: 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c  ckMask)!=0 && AL
7db0: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
7dc0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
7dd0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61  ite3BtreeLeave(a
7de0: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
7df0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
7e00: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
7e10: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
7e20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
7e30: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
7e40: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
7e50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7e60: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
7e70: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
7e80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
7e90: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
7ea0: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
7eb0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
7ec0: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
7ed0: 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30  .  char zCom[100
7ee0: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
7ef0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
7f00: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
7f10: 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20  d %4d %4d %-13s 
7f20: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
7f30: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
7f40: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
7f50: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
7f60: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
7f70: 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51  Ptr));.#ifdef SQ
7f80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
7f90: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64  AIN_COMMENTS.  d
7fa0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
7fb0: 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69  p, zP4, zCom, si
7fc0: 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c  zeof(zCom));.#el
7fd0: 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30  se.  zCom[0] = 0
7fe0: 0a 23 65 6e 64 69 66 0a 20 20 66 70 72 69 6e 74  .#endif.  fprint
7ff0: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
8000: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
8010: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8020: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
8030: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
8040: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
8050: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
8060: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
8070: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
8080: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
8090: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
80a0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
80b0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
80c0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
80d0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
80e0: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
80f0: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
8100: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
8110: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
8120: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
8130: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
8140: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
8150: 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  d ){.      for(p
8160: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
8170: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
8180: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8190: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
81a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
81b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
81c0: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
81d0: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
81e0: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
81f0: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
8200: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
8210: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
8220: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
8230: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
8240: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
8250: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
8260: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
8270: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
8280: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
8290: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
82a0: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
82b0: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
82c0: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
82d0: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
82e0: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
82f0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
8300: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
8310: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
8320: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
8330: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
8340: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
8350: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
8360: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
8370: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
8380: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
8390: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
83a0: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
83b0: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
83c0: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
83d0: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
83e0: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
83f0: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
8400: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
8410: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
8420: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
8430: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
8440: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
8450: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
8460: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
8470: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
8480: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
8490: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
84a0: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
84b0: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
84c0: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
84d0: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
84e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
84f0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
8500: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
8510: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
8520: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
8530: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
8540: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
8550: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c  else if( p->zMal
8560: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
8570: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8580: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
8590: 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63        p->zMalloc
85a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
85b0: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
85c0: 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20  MEM_Invalid;.   
85d0: 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f   }.    db->mallo
85e0: 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63  cFailed = malloc
85f0: 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a  _failed;.  }.}..
8600: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56  /*.** Delete a V
8610: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20  dbeFrame object 
8620: 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  and its contents
8630: 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  . VdbeFrame obje
8640: 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  cts are.** alloc
8650: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50  ated by the OP_P
8660: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e  rogram opcode in
8670: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
8680: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
8690: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
86a0: 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29  te(VdbeFrame *p)
86b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  {.  int i;.  Mem
86c0: 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61   *aMem = VdbeFra
86d0: 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65  meMem(p);.  Vdbe
86e0: 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d  Cursor **apCsr =
86f0: 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29   (VdbeCursor **)
8700: 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d  &aMem[p->nChildM
8710: 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  em];.  for(i=0; 
8720: 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20  i<p->nChildCsr; 
8730: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
8740: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
8750: 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b  p->v, apCsr[i]);
8760: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
8770: 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e  mArray(aMem, p->
8780: 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71  nChildMem);.  sq
8790: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76  lite3DbFree(p->v
87a0: 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66  ->db, p);.}..#if
87b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
87c0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47  _EXPLAIN./*.** G
87d0: 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  ive a listing of
87e0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20   the program in 
87f0: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
8800: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
8810: 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20  nterface is the 
8820: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56  same as sqlite3V
8830: 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20  dbeExec().  But 
8840: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75  instead of.** ru
8850: 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20  nning the code, 
8860: 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  it invokes the c
8870: 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72  allback once for
8880: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
8890: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75  n..** This featu
88a0: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  re is used to im
88b0: 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e  plement "EXPLAIN
88c0: 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  "..**.** When p-
88d0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63  >explain==1, eac
88e0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
88f0: 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a   listed.  When.*
8900: 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c  * p->explain==2,
8910: 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e   only OP_Explain
8920: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
8930: 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65  e listed and the
8940: 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20  se.** are shown 
8950: 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66  in a different f
8960: 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61  ormat.  p->expla
8970: 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f  in==2 is used to
8980: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58   implement.** EX
8990: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
89a0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
89b0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73  explain==1, firs
89c0: 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  t the main progr
89d0: 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68  am is listed, th
89e0: 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68  en each of.** th
89f0: 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  e trigger subpro
8a00: 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64  grams are listed
8a10: 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a   one by one..*/.
8a20: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c  int sqlite3VdbeL
8a30: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20  ist(.  Vdbe *p  
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
8a60: 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20  ){.  int nRow;  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
8a90: 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74  p when row count
8aa0: 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f   reaches this */
8ab0: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b  .  int nSub = 0;
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8ae0: 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73  r of sub-vdbes s
8af0: 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
8b00: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
8b10: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
8b20: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
8b30: 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20   sub-vdbes */.  
8b40: 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20  Mem *pSub = 0;  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
8b70: 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f  ell hold array o
8b80: 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20  f subprogs */.  
8b90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
8ba0: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
8bb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
8bc0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
8bd0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8c00: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
8c10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8c20: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
8c30: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
8c40: 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  de */.  Mem *pMe
8c50: 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  m = &p->aMem[1];
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c70: 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73  First Mem of res
8c80: 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73  ult set */..  as
8c90: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
8ca0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
8cb0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
8cc0: 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65  IC_RUN );.  asse
8cd0: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
8ce0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
8cf0: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d  QLITE_BUSY || p-
8d00: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
8d10: 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20  M );..  /* Even 
8d20: 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f  though this opco
8d30: 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  de does not use 
8d40: 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20  dynamic strings 
8d50: 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73  for.  ** the res
8d60: 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75  ult, result colu
8d70: 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64  mns may become d
8d80: 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73  ynamic if the us
8d90: 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71  er calls.  ** sq
8da0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
8db0: 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61  t16(), causing a
8dc0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20   translation to 
8dd0: 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e  UTF-16 encoding.
8de0: 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d  .  */.  releaseM
8df0: 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29  emArray(pMem, 8)
8e00: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
8e10: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  t = 0;..  if( p-
8e20: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
8e30: 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  M ){.    /* This
8e40: 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61   happens if a ma
8e50: 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20  lloc() inside a 
8e60: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
8e70: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72  column_text() or
8e80: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
8e90: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20  column_text16() 
8ea0: 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20  failed.  */.    
8eb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8ec0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
8ed0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8ee0: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
8ef0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
8f00: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
8f10: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
8f20: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
8f30: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
8f40: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
8f50: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
8f60: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
8f70: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
8f80: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
8f90: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
8fa0: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
8fb0: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
8fc0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
8fd0: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
8fe0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
8ff0: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
9000: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
9010: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
9020: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
9030: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
9040: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
9050: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
9060: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
9070: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
9080: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
9090: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
90a0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
90b0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
90c0: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
90d0: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
90e0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
90f0: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
9100: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
9110: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
9120: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
9130: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
9140: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
9150: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
9160: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
9170: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
9180: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
9190: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
91a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
91b0: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
91c0: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
91d0: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
91e0: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
91f0: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
9200: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
9210: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
9220: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
9230: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
9240: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
9250: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
9260: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
9270: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
9280: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
9290: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
92a0: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
92b0: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
92c0: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
92d0: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
92e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
92f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
9300: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
9310: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
9320: 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70  do{.    i = p->p
9330: 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  c++;.  }while( i
9340: 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c  <nRow && p->expl
9350: 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70  ain==2 && p->aOp
9360: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45  [i].opcode!=OP_E
9370: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
9380: 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70  i>=nRow ){.    p
9390: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
93a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
93b0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
93c0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
93d0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
93e0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
93f0: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
9400: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
9410: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
9420: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
9430: 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c  g, db, "%s", sql
9440: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
9450: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
9460: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20   char *zP4;.    
9470: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
9480: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
9490: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
94a0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
94b0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
94c0: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
94d0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
94e0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
94f0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
9500: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
9510: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
9520: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
9530: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
9540: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
9550: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
9560: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
9570: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
9580: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
9590: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
95a0: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
95b0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
95c0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
95d0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
95e0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
95f0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
9600: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
9610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9620: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
9630: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
9640: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
9650: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
9660: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
9670: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
9680: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
96b0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
96c0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
96d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
96e0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
96f0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
9700: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
9710: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
9720: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
9730: 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  e); /* Opcode */
9740: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9750: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
9760: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
9770: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
9780: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
9790: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
97a0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
97b0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
97c0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
97d0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  ++;..      /* Wh
97e0: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
97f0: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
9800: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
9810: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
9820: 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42       ** a P4_SUB
9830: 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74  PROGRAM argument
9840: 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69  ), expand the si
9850: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
9860: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20  of subprograms. 
9870: 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20       ** kept in 
9880: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20  p->aMem[9].z to 
9890: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f  hold the new pro
98a0: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20  gram - assuming 
98b0: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a  this subprogram.
98c0: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74        ** has not
98d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
98e0: 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  en..      */.   
98f0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
9900: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
9910: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
9920: 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31   nByte = (nSub+1
9930: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
9940: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69  ram*);.        i
9950: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
9960: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a  r(j=0; j<nSub; j
9970: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
9980: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70  f( apSub[j]==pOp
9990: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
99a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
99b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
99c0: 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f  nSub && SQLITE_O
99d0: 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65  K==sqlite3VdbeMe
99e0: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
99f0: 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20  e, nSub!=0) ){. 
9a00: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d           apSub =
9a10: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
9a20: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20  pSub->z;.       
9a30: 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d     apSub[nSub++]
9a40: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
9a50: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ram;.          p
9a60: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Sub->flags |= ME
9a70: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  M_Blob;.        
9a80: 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62    pSub->n = nSub
9a90: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
9aa0: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  am*);.        }.
9ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9ac0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9ad0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
9ae0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
9af0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9b10: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  1 */.    pMem->t
9b20: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
9b30: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
9b40: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
9b50: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
9b60: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
9b70: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
9ba0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
9bb0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
9bc0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
9bd0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
9be0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
9bf0: 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20  = pOp->p3;      
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
9c20: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9c30: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
9c40: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
9c50: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
9c60: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20  mGrow(pMem, 32, 
9c70: 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  0) ){           
9c80: 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20   /* P4 */.      
9c90: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
9ca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9cb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9cc0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
9cd0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9ce0: 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74  = MEM_Dyn|MEM_St
9cf0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
9d00: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
9d10: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32  pOp, pMem->z, 32
9d20: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d  );.    if( zP4!=
9d30: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
9d40: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
9d50: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
9d60: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
9d70: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
9d80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9d90: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
9da0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
9db0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
9dc0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
9dd0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
9de0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
9df0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9e00: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
9e10: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
9e20: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
9e30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9e40: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
9e50: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
9e60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
9e70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9e80: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
9e90: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9ea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
9eb0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9ec0: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
9ed0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
9ee0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
9ef0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9f00: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
9f10: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
9f20: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
9f30: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
9f40: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
9f50: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
9f60: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
9f70: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
9f80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
9f90: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
9fa0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9fb0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
9fc0: 2c 20 35 30 30 2c 20 30 29 20 29 7b 0a 20 20 20  , 500, 0) ){.   
9fd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fe0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ff0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
a000: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
a010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a020: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a030: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
a040: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
a050: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
a060: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
a070: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
a080: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
a090: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
a0a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
a0b0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
a0c0: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  lse.      pMem->
a0d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
a0e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
a100: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  nt */.      pMem
a110: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
a120: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  NULL;.#endif.   
a130: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
a140: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
a150: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
a160: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
a170: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
a180: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a190: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
a1a0: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
a1b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
a1c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a1d0: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
a1e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a1f0: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
a200: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
a210: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
a220: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
a230: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a240: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
a250: 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20  be *p){.  const 
a260: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  char *z = 0;.  i
a270: 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
a280: 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20    z = p->zSql;. 
a290: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f   }else if( p->nO
a2a0: 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p>=1 ){.    cons
a2b0: 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20  t VdbeOp *pOp = 
a2c0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20  &p->aOp[0];.    
a2d0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
a2e0: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
a2f0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
a300: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a     z = pOp->p4.z
a310: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
a320: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
a330: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) z++;.    }. 
a340: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69   }.  if( z ) pri
a350: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
a360: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ", z);.}.#endif.
a370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a380: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
a390: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
a3a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
a3b0: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
a3c0: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
a3d0: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
a3e0: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
a3f0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
a400: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
a410: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
a420: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
a430: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
a440: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
a450: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
a460: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
a470: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
a480: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
a490: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
a4a0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
a4b0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
a4c0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
a4d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a4e0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
a4f0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
a500: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
a510: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
a520: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
a530: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
a540: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
a550: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
a560: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
a570: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
a580: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
a590: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
a5a0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
a5b0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
a5c0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
a5d0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
a5e0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
a5f0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
a600: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
a610: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
a620: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
a630: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
a640: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  CE */../*.** All
a650: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d  ocate space from
a660: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75   a fixed size bu
a670: 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ffer and return 
a680: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
a690: 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20  that space.  If 
a6a0: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
a6b0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ce is available,
a6c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
a6d0: 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72  .** The pBuf par
a6e0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e  ameter is the in
a6f0: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61  itial value of a
a700: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77   pointer which w
a710: 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74  ill.** receive t
a720: 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  he new memory.  
a730: 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  pBuf is normally
a740: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20   NULL.  If pBuf 
a750: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20  is not.** NULL, 
a760: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65  it means that me
a770: 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61  mory space has a
a780: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
a790: 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a  cated and that.*
a7a0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
a7b0: 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61  hould not alloca
a7c0: 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72  te any new memor
a7d0: 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73  y.  When pBuf is
a7e0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d   not.** NULL sim
a7f0: 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e  ply return pBuf.
a800: 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20    Only allocate 
a810: 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  new memory space
a820: 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73   when pBuf.** is
a830: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   NULL..**.** nBy
a840: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
a850: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
a860: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
a870: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20   *ppFrom points 
a880: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  to available spa
a890: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e  ce and pEnd poin
a8a0: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ts to the end of
a8b0: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   the.** availabl
a8c0: 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73  e space.  When s
a8d0: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
a8e0: 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64  d, *ppFrom is ad
a8f0: 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74  vanced past.** t
a900: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c  he end of the al
a910: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a  located space..*
a920: 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20  *.** *pnByte is 
a930: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  a counter of the
a940: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
a950: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68   of space that h
a960: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  ave failed.** to
a970: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74   allocate.  If t
a980: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63  here is insuffic
a990: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70  ient space in *p
a9a0: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79  pFrom to satisfy
a9b0: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c   the.** request,
a9c0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
a9d0: 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61  *pnByte by the a
a9e0: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71  mount of the req
a9f0: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uest..*/.static 
aa00: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
aa10: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  (.  void *pBuf, 
aa20: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
aa30: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  e return pointer
aa40: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
aa50: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
aa60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
aa70: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
aa80: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38  allocate */.  u8
aa90: 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20   **ppFrom,      
aaa0: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c     /* IN/OUT: Al
aab0: 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46  locate from *ppF
aac0: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  rom */.  u8 *pEn
aad0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
aae0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
aaf0: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
ab00: 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65  of *ppFrom buffe
ab10: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79  r */.  int *pnBy
ab20: 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  te          /* I
ab30: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  f allocation can
ab40: 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63  not be made, inc
ab50: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a  rement *pnByte *
ab60: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
ab70: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
ab80: 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a  ENT(*ppFrom) );.
ab90: 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74    if( pBuf ) ret
aba0: 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74  urn pBuf;.  nByt
abb0: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
abc0: 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72  );.  if( &(*ppFr
abd0: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45  om)[nByte] <= pE
abe0: 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d  nd ){.    pBuf =
abf0: 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b   (void*)*ppFrom;
ac00: 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20  .    *ppFrom += 
ac10: 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nByte;.  }else{.
ac20: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e      *pnByte += n
ac30: 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
ac40: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
ac50: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
ac60: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
ac70: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
ac80: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
ac90: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
aca0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
acb0: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
acc0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
acd0: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
ace0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
acf0: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
ad00: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
ad10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ad20: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
ad30: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
ad40: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
ad50: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
ad60: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
ad70: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
ad80: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
ad90: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
ada0: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
adb0: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
adc0: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
add0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
ade0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
adf0: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20  EBUG.  for(i=1; 
ae00: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
ae10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
ae20: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
ae30: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
ae40: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
ae50: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
ae60: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
ae70: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
ae80: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
ae90: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
aea0: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
aeb0: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
aec0: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
aed0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
aee0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
aef0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
af00: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
af10: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
af20: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
af30: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
af40: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
af50: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
af60: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
af70: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
af80: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
af90: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
afa0: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
afb0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
afc0: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
afd0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
afe0: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
aff0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
b000: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
b010: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
b020: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
b030: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
b040: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
b050: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
b060: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
b070: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
b080: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
b090: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
b0a0: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
b0b0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
b0c0: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f  e called exact o
b0d0: 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69  nce on a each vi
b0e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
b0f0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
b100: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
b110: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
b120: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
b130: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
b140: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
b150: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
b160: 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f   futher calls to
b170: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
b180: 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
b190: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
b1a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
b1b0: 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
b1c0: 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
b1d0: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
b1e0: 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
b1f0: 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
b200: 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
b210: 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
b220: 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
b230: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
b240: 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
b250: 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
b260: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
b270: 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
b280: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
b290: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
b2a0: 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
b2b0: 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
b2c0: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
b2d0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
b2e0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
b2f0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
b320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b350: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
b360: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
b370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b380: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
b390: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
b3a0: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
b3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b3c0: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
b3d0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
b3e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b3f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b400: 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
b410: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
b420: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
b430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b440: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
b450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
b460: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b480: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
b490: 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
b4a0: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e  ams */.  int nOn
b4b0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
b4c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b4d0: 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  r of OP_Once ins
b4e0: 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  tructions */.  i
b4f0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b510: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b520: 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20  .  u8 *zCsr;    
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69    /* Memory avai
b550: 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  lable for alloca
b560: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45  tion */.  u8 *zE
b570: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
b580: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b590: 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f  t byte past allo
b5a0: 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  cated memory */.
b5b0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74   /* How much ext
b5e0: 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65  ra memory is nee
b5f0: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
b600: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
b610: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
b620: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
b630: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b640: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
b650: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
b660: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
b670: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
b680: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
b690: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
b6a0: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
b6b0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
b6c0: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
b6d0: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
b6e0: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
b6f0: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
b700: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
b710: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
b720: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
b730: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
b740: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
b750: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
b760: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
b770: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
b780: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
b790: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
b7a0: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
b7b0: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
b7c0: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
b7d0: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
b7e0: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
b7f0: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
b800: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
b810: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
b820: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
b830: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
b840: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
b850: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
b860: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
b870: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
b880: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
b890: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
b8a0: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
b8b0: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
b8c0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
b8d0: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
b8e0: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
b8f0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
b900: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
b910: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
b920: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
b930: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
b940: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
b950: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
b960: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
b970: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
b980: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
b990: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
b9a0: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
b9b0: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
b9c0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
b9d0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
b9e0: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
b9f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
ba00: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
ba10: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a  ->nOpAlloc];  /*
ba20: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
ba30: 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a   end of zCsr[] *
ba40: 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  /..  resolveP2Va
ba50: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
ba60: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
ba70: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
ba80: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
ba90: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
baa0: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
bab0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
bac0: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
bad0: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
bae0: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
baf0: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43  zEnd-zCsr);.  zC
bb00: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75  sr += (zCsr - (u
bb10: 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72  8*)0)&7;.  asser
bb20: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
bb30: 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b  IGNMENT(zCsr) );
bb40: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
bb50: 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
bb60: 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
bb70: 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
bb80: 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
bb90: 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a  ated in two.  **
bba0: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
bbb0: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
bbc0: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
bbd0: 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  sed space at the
bbe0: 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68   .  ** end of th
bbf0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
bc00: 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
bc10: 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c  e to satisfy all
bc20: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71   memory.  ** req
bc30: 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75  uirements by reu
bc40: 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20  sing the opcode 
bc50: 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e  array tail, then
bc60: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
bc70: 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20   pass will fill 
bc80: 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e  in the rest usin
bc90: 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61  g a fresh alloca
bca0: 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  tion.  .  **.  *
bcb0: 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
bcc0: 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
bcd0: 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
bce0: 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
bcf0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65  from.  ** the le
bd00: 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20  ftover space at 
bd10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
bd20: 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20  pcode array can 
bd30: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
bd40: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
bd50: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
bd60: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
bd70: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
bd80: 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79  /.  do {.    nBy
bd90: 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  te = 0;.    p->a
bda0: 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
bdb0: 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73  (p->aMem, nMem*s
bdc0: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
bdd0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
bde0: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
bdf0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56  allocSpace(p->aV
be00: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
be10: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
be20: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
be30: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
be40: 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20  Space(p->apArg, 
be50: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
be60: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
be70: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
be80: 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  azVar = allocSpa
be90: 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61  ce(p->azVar, nVa
bea0: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c  r*sizeof(char*),
beb0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
bec0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Byte);.    p->ap
bed0: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
bee0: 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73  (p->apCsr, nCurs
bef0: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
bf00: 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20  rsor*),.        
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26    &zCsr, zEnd, &
bf30: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
bf40: 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63  OnceFlag = alloc
bf50: 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c  Space(p->aOnceFl
bf60: 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72  ag, nOnce, &zCsr
bf70: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
bf80: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
bf90: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65  {.      p->pFree
bfa0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
bfb0: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
bfc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73  );.    }.    zCs
bfd0: 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20  r = p->pFree;.  
bfe0: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
bff0: 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28  Byte];.  }while(
c000: 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d   nByte && !db->m
c010: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
c020: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
c030: 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e  Cursor;.  p->nOn
c040: 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a  ceFlag = nOnce;.
c050: 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b    if( p->aVar ){
c060: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28  .    p->nVar = (
c070: 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20  ynVar)nVar;.    
c080: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
c090: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
c0a0: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
c0b0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
c0c0: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20  p->aVar[n].db = 
c0d0: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
c0e0: 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a  if( p->azVar ){.
c0f0: 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70      p->nzVar = p
c100: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20  Parse->nzVar;.  
c110: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61    memcpy(p->azVa
c120: 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  r, pParse->azVar
c130: 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  , p->nzVar*sizeo
c140: 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  f(p->azVar[0]));
c150: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72  .    memset(pPar
c160: 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50  se->azVar, 0, pP
c170: 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65  arse->nzVar*size
c180: 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  of(pParse->azVar
c190: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
c1a0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
c1b0: 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20  p->aMem--;      
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66  /* aMem[] goes f
c1e0: 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20  rom 1..nMem */. 
c1f0: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
c200: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
c210: 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20     /*       not 
c220: 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a  from 0..nMem-1 *
c230: 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  /.    for(n=1; n
c240: 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  <=nMem; n++){.  
c250: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
c260: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c  lags = MEM_Inval
c270: 69 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  id;.      p->aMe
c280: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
c290: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70    }.  }.  p->exp
c2a0: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
c2b0: 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65  xplain;.  sqlite
c2c0: 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a  3VdbeRewind(p);.
c2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
c2e0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
c2f0: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
c300: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
c310: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
c320: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
c330: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
c340: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
c350: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
c360: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
c370: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
c380: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
c390: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
c3a0: 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28  >db, pCx);.  if(
c3b0: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
c3c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
c3d0: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
c3e0: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
c3f0: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
c400: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
c410: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
c420: 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   by.    ** the c
c430: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
c440: 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70  }else if( pCx->p
c450: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
c460: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
c470: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
c480: 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
c490: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
c4a0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
c4b0: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
c4c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c4d0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
c4e0: 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e  abCursor = pCx->
c4f0: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20  pVtabCursor;.   
c500: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
c510: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
c520: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
c530: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
c540: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
c550: 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75  d = 1;.    pModu
c560: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
c570: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e  Cursor);.    p->
c580: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
c590: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
c5a0: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
c5b0: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
c5c0: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
c5d0: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
c5e0: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
c5f0: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
c600: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
c610: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
c620: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
c630: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
c640: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
c650: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
c660: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
c670: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
c680: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
c690: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76  = pFrame->v;.  v
c6a0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46  ->aOnceFlag = pF
c6b0: 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b  rame->aOnceFlag;
c6c0: 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  v->nOnceFlag 
c6d0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46  = pFrame->nOnceF
c6e0: 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  lag;.  v->aOp = 
c6f0: 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
c700: 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
c710: 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
c720: 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
c730: 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
c740: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
c750: 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
c760: 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
c770: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
c780: 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
c790: 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
c7a0: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
c7b0: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
c7c0: 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72  me->nChange;.  r
c7d0: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
c7e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
c7f0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
c800: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
c810: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
c820: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
c830: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
c840: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
c850: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
c860: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
c870: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
c880: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
c890: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
c8a0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
c8b0: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
c8c0: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
c8d0: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
c8e0: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
c8f0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
c900: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
c910: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
c920: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
c930: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
c940: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
c950: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
c960: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
c970: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
c980: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c990: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
c9a0: 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rame);.  }.  p->
c9b0: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  pFrame = 0;.  p-
c9c0: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  >nFrame = 0;..  
c9d0: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
c9e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
c9f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
ca00: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
ca10: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
ca20: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
ca30: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
ca40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ca50: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
ca60: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
ca70: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
ca80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ca90: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
caa0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
cab0: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
cac0: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
cad0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
cae0: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
caf0: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
cb00: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
cb10: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
cb20: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
cb30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
cb40: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
cb50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
cb60: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
cb70: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
cb80: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73  by the VM */.  s
cb90: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
cba0: 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30  AuxData(p, -1, 0
cbb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
cbc0: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d  pAuxData==0 );.}
cbd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
cbe0: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
cbf0: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
cc00: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
cc10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
cc20: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
cc30: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
cc40: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
cc50: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
cc60: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
cc70: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
cc80: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
cc90: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
cca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ccb0: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
ccc0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
ccd0: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
cce0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ccf0: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
cd00: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
cd10: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
cd20: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
cd30: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
cd40: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
cd50: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
cd60: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
cd70: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
cd80: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
cd90: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
cda0: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
cdb0: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
cdc0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
cdd0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
cde0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
cdf0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
ce00: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c  flags==MEM_Inval
ce10: 69 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  id );.  }.#endif
ce20: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
ce30: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
ce40: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
ce50: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
ce60: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
ce70: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
ce80: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
ce90: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
cea0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
ceb0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
cec0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
ced0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
cee0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
cef0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
cf00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
cf10: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
cf20: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
cf30: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
cf40: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
cf50: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
cf60: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
cf70: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
cf80: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
cf90: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
cfa0: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
cfb0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
cfc0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
cfd0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
cfe0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
cff0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
d000: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
d010: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
d020: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
d030: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
d040: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
d050: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
d060: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
d070: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
d080: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
d090: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
d0a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d0b0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
d0c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
d0d0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
d0e0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
d0f0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
d100: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
d110: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
d120: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
d130: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
d140: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
d150: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d160: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
d170: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
d180: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
d190: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
d1a0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
d1b0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
d1c0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
d1d0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
d1e0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
d1f0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
d200: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
d210: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
d220: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
d230: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
d240: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
d250: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
d260: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
d270: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
d280: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
d290: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
d2a0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
d2b0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
d2c0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
d2d0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
d2e0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
d2f0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
d300: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d310: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
d340: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
d350: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
d380: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
d390: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
d3a0: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d3c0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
d3d0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
d3e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
d3f0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
d400: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
d410: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
d420: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
d430: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
d440: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
d450: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
d460: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
d470: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
d480: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
d490: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
d4a0: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
d4b0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
d4c0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
d4d0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
d4e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d4f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
d500: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
d510: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
d520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d530: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
d540: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
d550: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
d560: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
d570: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
d580: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
d590: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
d5a0: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
d5b0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
d5c0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
d5d0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
d5e0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
d5f0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
d600: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
d610: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d620: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
d630: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
d640: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
d650: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
d660: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
d670: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
d680: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
d690: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
d6a0: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
d6b0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
d6c0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
d6d0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
d6e0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
d6f0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
d700: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d710: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
d720: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
d730: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
d740: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
d750: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
d760: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
d770: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
d780: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
d790: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
d7a0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
d7b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
d7c0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
d7d0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
d7e0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d7f0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
d800: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
d810: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
d820: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
d830: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
d840: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
d850: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
d860: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d870: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
d880: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
d890: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
d8a0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
d8b0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
d8c0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
d8d0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
d8e0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
d8f0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
d900: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
d910: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
d920: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
d930: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d940: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
d950: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
d960: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
d970: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
d980: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
d990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
d9a0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
d9b0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
d9c0: 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
d9d0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
d9e0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
d9f0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
da00: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
da10: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
da20: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
da30: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
da40: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
da50: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
da60: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
da70: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
da80: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
da90: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
daa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
dab0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
dac0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
dad0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
dae0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
daf0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
db00: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
db10: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
db20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
db30: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
db40: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
db50: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
db60: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
db70: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
db80: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
db90: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
dba0: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
dbb0: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73  Trans++;.      s
dbc0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
dbd0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
dbe0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
dbf0: 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
dc00: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
dc10: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
dc20: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
dc30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
dc40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dc50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
dc60: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
dc70: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
dc80: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
dc90: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
dca0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
dcb0: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
dcc0: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
dcd0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
dce0: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
dcf0: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
dd00: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
dd10: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
dd20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dd30: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
dd40: 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
dd50: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
dd60: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
dd70: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
dd80: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
dd90: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
dda0: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
ddb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
ddc0: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
ddd0: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
dde0: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
ddf0: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
de00: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
de10: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
de20: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
de30: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
de40: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
de50: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
de60: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
de70: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
de80: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
de90: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
dea0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
deb0: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
dec0: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
ded0: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
dee0: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
def0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
df00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
df10: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
df20: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
df30: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
df40: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
df50: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
df60: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
df70: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
df80: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
df90: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
dfa0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
dfb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dfc0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
dfd0: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
dfe0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
dff0: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
e000: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
e010: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
e020: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
e030: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
e040: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
e050: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e060: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
e070: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
e080: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
e090: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
e0a0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
e0b0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
e0c0: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
e0d0: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
e0e0: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
e0f0: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
e100: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
e110: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
e120: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e130: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e140: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
e150: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
e160: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e170: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e180: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
e190: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
e1a0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
e1b0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
e1c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e1d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e1e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
e1f0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
e200: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e210: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
e220: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
e230: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
e240: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
e250: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
e260: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
e270: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
e280: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
e290: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
e2a0: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
e2b0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
e2c0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
e2d0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
e2e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
e2f0: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
e300: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
e310: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
e320: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
e330: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
e340: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
e350: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
e360: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
e370: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
e380: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
e390: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
e3a0: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
e3b0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
e3c0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
e3d0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
e3e0: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
e3f0: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
e400: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
e410: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e420: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
e430: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
e440: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
e450: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
e460: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
e470: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
e480: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
e490: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
e4a0: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
e4b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e4c0: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  M;.    do {.    
e4d0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
e4e0: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
e4f0: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
e500: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
e510: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
e520: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
e530: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
e540: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
e550: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e560: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
e570: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
e580: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e590: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
e5a0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
e5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e5c0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
e5d0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
e5e0: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
e5f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e600: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
e610: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
e620: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
e630: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
e640: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
e650: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
e660: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
e670: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
e680: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
e6b0: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
e6c0: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
e6d0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
e6e0: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
e6f0: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
e700: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e710: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
e720: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
e730: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
e740: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
e750: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
e760: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
e770: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
e780: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
e790: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
e7a0: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
e7b0: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
e7c0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
e7d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
e7e0: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
e7f0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
e800: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
e810: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
e820: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
e830: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
e840: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e850: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
e860: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
e870: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e880: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
e890: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
e8a0: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
e8b0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
e8c0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
e8d0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
e8e0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
e8f0: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
e900: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
e910: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
e920: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
e930: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e940: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e950: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e960: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
e970: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
e980: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
e990: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
e9a0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
e9b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
e9c0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
e9d0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
e9e0: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
e9f0: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
ea00: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
ea10: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
ea20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ea30: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
ea40: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
ea50: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
ea60: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
ea70: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
ea80: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
ea90: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
eaa0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
eab0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
eac0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
ead0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
eae0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
eaf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
eb00: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
eb10: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
eb20: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
eb30: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
eb40: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
eb50: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
eb60: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
eb70: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
eb80: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
eb90: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
eba0: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
ebb0: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
ebc0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
ebd0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
ebe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ebf0: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
ec00: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
ec10: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
ec20: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
ec30: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
ec40: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
ec50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ec60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ec70: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
ec80: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
ec90: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
eca0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
ecb0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
ecc0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
ecd0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
ece0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ecf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ed00: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
ed10: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
ed20: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
ed30: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
ed40: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
ed50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ed60: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
ed70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
ed80: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
ed90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
eda0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
edb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
edc0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
edd0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
ede0: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
edf0: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
ee00: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
ee10: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
ee20: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
ee30: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
ee40: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
ee50: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
ee60: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
ee70: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
ee80: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
ee90: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
eea0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
eeb0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
eec0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
eed0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
eee0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
eef0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
ef00: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
ef10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
ef20: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
ef30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
ef40: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
ef50: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
ef60: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
ef70: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
ef80: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
ef90: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
efa0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
efb0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
efc0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
efd0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
efe0: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
eff0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
f000: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f010: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f020: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
f030: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
f040: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
f050: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
f060: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f070: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
f080: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
f090: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
f0a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
f0b0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
f0c0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
f0d0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
f0e0: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
f0f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f100: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
f110: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
f120: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
f130: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
f140: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
f150: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
f160: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f170: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f180: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
f190: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f1a0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
f1b0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
f1c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
f1d0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
f1e0: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
f1f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
f200: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
f210: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
f220: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f230: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
f240: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f250: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f260: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f270: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
f280: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f290: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
f2a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f2b0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
f2c0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
f2d0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
f2e0: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
f2f0: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
f300: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
f310: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
f320: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
f330: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
f340: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
f350: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
f360: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f370: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
f380: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f390: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
f3a0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
f3b0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
f3c0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
f3d0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
f3e0: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
f3f0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f400: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
f410: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
f420: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
f430: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
f440: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
f450: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
f460: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
f470: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
f480: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
f490: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
f4a0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
f4b0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
f4c0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
f4d0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
f4e0: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
f4f0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
f500: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
f510: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
f520: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
f530: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
f540: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
f550: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
f560: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
f570: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
f580: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
f590: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f5a0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
f5b0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
f5c0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
f5d0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
f5e0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
f5f0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
f600: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
f610: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
f620: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
f630: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
f640: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
f650: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f660: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
f670: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
f680: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f690: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
f6a0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
f6b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
f6c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
f6d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f6e0: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
f6f0: 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
f700: 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
f710: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
f720: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
f730: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
f740: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
f750: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
f760: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
f770: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
f780: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
f790: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
f7a0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
f7b0: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
f7c0: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
f7d0: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
f7e0: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
f7f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
f800: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
f810: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
f820: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
f830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
f840: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
f850: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
f860: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
f870: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
f880: 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
f890: 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
f8a0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
f8b0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
f8c0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
f8d0: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
f8e0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
f8f0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
f900: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
f910: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
f920: 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
f930: 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
f940: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
f950: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
f960: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
f970: 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
f980: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
f990: 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
f9a0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
f9b0: 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
f9c0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
f9d0: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
f9e0: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
f9f0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
fa00: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
fa10: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
fa20: 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
fa30: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
fa40: 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
fa50: 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
fa60: 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
fa70: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
fa80: 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
fa90: 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
faa0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
fab0: 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
fac0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
fad0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
fae0: 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
faf0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
fb00: 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
fb10: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
fb20: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
fb30: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
fb40: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
fb50: 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
fb60: 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
fb70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
fb80: 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
fb90: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
fba0: 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
fbb0: 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
fbc0: 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
fbd0: 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
fbe0: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
fbf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
fc00: 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
fc10: 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
fc20: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
fc30: 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
fc40: 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
fc50: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
fc60: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
fc70: 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
fc80: 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
fc90: 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
fca0: 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
fcb0: 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e  occurred, causin
fcc0: 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
fcd0: 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
fce0: 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
fcf0: 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
fd00: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
fd10: 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
fd20: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
fd30: 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
fd40: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
fd50: 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
fd60: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
fd70: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
fd80: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
fd90: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
fda0: 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
fdb0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
fdc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
fdd0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
fde0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
fdf0: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
fe00: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
fe10: 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
fe20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fe30: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
fe40: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
fe50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
fe60: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
fe70: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
fe80: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
fe90: 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
fea0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
feb0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
fec0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
fed0: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
fee0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
fef0: 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
ff00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ff10: 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
ff20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ff30: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
ff40: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
ff50: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
ff60: 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
ff70: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
ff80: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
ff90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ffa0: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
ffb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ffc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
ffd0: 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
ffe0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
fff0: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
10000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10010 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
10020 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10030 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10040 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
10050 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
10060 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
10070 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
10080 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
10090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
100a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
100b0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
100c0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
100d0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
100e0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
100f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
10100 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10110 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
10120 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
10130 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
10140 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
10150 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
10160 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
10170 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
10180 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
10190 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
101a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
101b0 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
101c0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
101d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
101e0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
101f0 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
10200 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
10210 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
10220 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
10230 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  tDefImmCons;.   
10240 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10250 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
10260 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
10270 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
10280 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
10290 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
102a0 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
102b0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
102c0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
102d0 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
102e0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
102f0 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
10300 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
10310 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
10320 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
10330 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
10340 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10350 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
10360 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
10370 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
10380 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
10390 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
103a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
103b0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
103c0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
103d0 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
103e0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
103f0 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
10400 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
10410 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
10420 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
10430 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
10440 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10450 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
10460 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
10470 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
10480 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
10490 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
104a0 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
104b0 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
104c0 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
104d0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
104e0 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
104f0 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
10500 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
10510 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
10520 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
10530 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
10540 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
10550 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
10560 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
10570 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
10580 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
10590 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
105a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
105b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
105c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
105d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
105e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
105f0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
10600 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
10610 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
10620 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
10630 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
10640 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
10650 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
10660 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
10670 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
10680 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
10690 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
106a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
106b0 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
106c0 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
106d0 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
106e0 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
106f0 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
10700 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
10710 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
10720 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
10730 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
10740 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
10750 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
10760 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
10770 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
10780 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
10790 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
107a0 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
107b0 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
107c0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
107d0 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
107e0 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
107f0 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
10800 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
10810 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
10820 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
10830 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
10840 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
10850 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10870 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
10880 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
10890 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
108a0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
108b0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
108c0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
108d0 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
108e0 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
108f0 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
10900 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
10910 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
10920 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
10930 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
10940 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
10950 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
10960 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
10970 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
10980 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
10990 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
109a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
109b0 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
109c0 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
109d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
109e0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
109f0 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
10a00 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
10a10 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
10a20 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
10a30 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
10a40 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
10a50 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
10a60 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
10a70 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
10a80 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
10a90 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
10aa0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
10ab0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
10ac0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10ad0 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
10ae0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
10af0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
10b00 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10b10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
10b20 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65  OnceFlag ) memse
10b30 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
10b40 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
10b50 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
10b60 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
10b70 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
10b80 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
10b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ba0 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
10bb0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
10bc0 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
10bd0 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
10be0 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
10bf0 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
10c00 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
10c10 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
10c20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
10c30 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
10c40 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
10c50 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
10c60 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
10c70 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
10c80 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
10c90 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
10ca0 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
10cb0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
10cc0 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
10cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
10ce0 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
10cf0 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
10d00 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
10d10 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
10d20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
10d30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10d40 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
10d50 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
10d60 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
10d70 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
10d80 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
10d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10da0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
10db0 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20  _BLOCKED );  /* 
10dc0 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f  This error no lo
10dd0 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20  nger exists */. 
10de0 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f     isSpecialErro
10df0 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  r = mrc==SQLITE_
10e00 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
10e10 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LITE_IOERR.     
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
10e40 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d  NTERRUPT || mrc=
10e50 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20  =SQLITE_FULL;.  
10e60 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
10e70 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
10e80 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
10e90 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  s read-only and 
10ea0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
10eb0 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  s SQLITE_INTERRU
10ec0 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  PT, .      ** no
10ed0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63   rollback is nec
10ee0 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73  essary. Otherwis
10ef0 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61  e, at least a sa
10f00 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
10f10 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  * transaction mu
10f20 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
10f30 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  k to restore the
10f40 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a   database to a .
10f50 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74        ** consist
10f60 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
10f70 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65   **.      ** Eve
10f80 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  n if the stateme
10f90 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  nt is read-only,
10fa0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
10fb0 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20   to perform.    
10fc0 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74    ** a statement
10fd0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   or transaction 
10fe0 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
10ff0 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
11000 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72   .      ** occur
11010 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
11020 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
11030 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
11040 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
11050 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
11060 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
11070 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
11080 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
11090 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
110a0 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
110b0 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
110c0 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
110d0 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
110e0 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
110f0 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
11100 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
11110 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
11120 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
11130 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
11140 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
11150 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11160 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
11170 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
11180 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
11190 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
111a0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
111b0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
111c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
111d0 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
111e0 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
111f0 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
11200 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
11210 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
11220 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
11230 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
11240 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
11250 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
11260 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
11270 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
11280 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
11290 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
112a0 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
112b0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
112c0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
112d0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
112e0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
112f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11300 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
11310 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
11320 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
11330 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
11340 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11360 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
11370 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
11380 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
11390 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
113a0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
113b0 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
113c0 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
113d0 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
113e0 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
113f0 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
11400 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
11410 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
11420 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
11430 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
11440 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
11450 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
11460 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
11470 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
11480 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
11490 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
114a0 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
114b0 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
114c0 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
114d0 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
114e0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
114f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
11500 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11510 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
11520 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
11530 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
11540 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
11550 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
11560 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
11570 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11590 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
115a0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
115b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
115c0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
115d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
115e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
115f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11610 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
11620 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
11630 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
11640 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
11650 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
11660 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
11670 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
11680 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
11690 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
116a0 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
116b0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
116c0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
116d0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
116e0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
116f0 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
11700 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
11710 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
11720 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
11730 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
11740 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
11750 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
11760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11770 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11780 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
11790 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
117a0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
117b0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
117c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
117d0 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
117e0 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
117f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11800 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
11810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
11820 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
11830 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
11840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11850 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
11860 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
11870 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
11880 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
11890 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
118a0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
118b0 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
118c0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
118d0 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
118e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
118f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11900 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
11910 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
11920 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OK);.      }.   
11930 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
11940 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
11950 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
11960 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
11970 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11980 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
11990 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
119a0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
119b0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
119c0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
119d0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
119e0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
119f0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
11a00 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
11a10 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
11a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
11a40 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
11a50 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
11a60 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
11a70 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
11a80 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
11a90 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
11aa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
11ab0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
11ac0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
11ad0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
11ae0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
11af0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
11b00 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
11b10 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
11b20 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
11b30 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
11b40 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
11b50 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
11b60 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
11b70 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
11b80 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
11b90 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
11ba0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
11bb0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
11bc0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
11bd0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
11be0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
11bf0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
11c00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
11c10 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
11c20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11c30 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
11c40 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
11c50 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
11c60 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
11c70 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11c80 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
11c90 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
11ca0 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
11cb0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
11cc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11cd0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
11ce0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
11cf0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
11d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11d10 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
11d20 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
11d30 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
11d40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11d50 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
11d60 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
11d70 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
11d80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
11d90 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
11da0 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
11db0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
11dc0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
11dd0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
11de0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
11df0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
11e00 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
11e10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
11e20 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
11e30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
11e40 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
11e50 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
11e60 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
11e70 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
11e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
11e90 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
11ea0 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
11eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11ec0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
11ed0 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
11ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
11ef0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
11f00 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
11f10 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
11f20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
11f30 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
11f40 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
11f50 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
11f60 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
11f70 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
11f80 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
11f90 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
11fa0 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
11fb0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
11fc0 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
11fd0 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
11fe0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
11ff0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
12000 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12010 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
12020 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
12030 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12040 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
12050 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
12060 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12070 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
12080 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
12090 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
120a0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
120b0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
120c0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
120d0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
120e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
120f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
12100 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
12110 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
12120 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
12130 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
12140 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
12150 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
12160 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
12170 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
12180 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
12190 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
121a0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
121b0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
121c0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
121d0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
121e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
121f0 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
12200 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
12210 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
12220 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
12230 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
12240 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
12250 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
12260 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
12270 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
12280 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
12290 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
122a0 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
122b0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
122c0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
122d0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
122e0 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
122f0 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
12300 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
12310 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
12320 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
12330 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
12340 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
12350 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12360 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
12370 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
12380 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
12390 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
123a0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
123b0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
123c0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
123d0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
123e0 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
123f0 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
12400 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
12410 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
12420 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
12430 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12440 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
12450 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
12460 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
12470 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
12480 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
12490 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
124a0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
124b0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
124c0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
124d0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
124e0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
124f0 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
12500 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  ){.    u8 malloc
12510 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  Failed = db->mal
12520 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73  locFailed;.    s
12530 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12540 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
12550 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
12560 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
12570 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
12580 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
12590 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
125a0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
125b0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
125c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
125d0 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20   mallocFailed;. 
125e0 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
125f0 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
12600 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
12610 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20  b, rc, 0);.  }. 
12620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
12630 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12640 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
12650 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f   If an SQLITE_CO
12660 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b  NFIG_SQLLOG hook
12670 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
12680 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  nd the VM has be
12690 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f  en run, .** invo
126a0 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ke it..*/.static
126b0 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65   void vdbeInvoke
126c0 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b  Sqllog(Vdbe *v){
126d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
126e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
126f0 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c  og && v->rc==SQL
12700 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71  ITE_OK && v->zSq
12710 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b  l && v->pc>=0 ){
12720 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61  .    char *zExpa
12730 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  nded = sqlite3Vd
12740 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76  beExpandSql(v, v
12750 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73  ->zSql);.    ass
12760 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74  ert( v->db->init
12770 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
12780 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b  if( zExpanded ){
12790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
127a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
127b0 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71  og(.          sq
127c0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
127d0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d  g.pSqllogArg, v-
127e0 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20  >db, zExpanded, 
127f0 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  1.      );.     
12800 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
12810 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29  ->db, zExpanded)
12820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
12830 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
12840 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29  eInvokeSqllog(x)
12850 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12860 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
12870 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
12880 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
12890 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
128a0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
128b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
128c0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
128d0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
128e0 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
128f0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
12900 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
12910 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
12920 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
12930 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
12940 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
12950 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
12960 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
12970 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
12980 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
12990 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
129a0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
129b0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
129c0 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
129d0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
129e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
129f0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
12a00 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
12a10 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
12a20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
12a30 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
12a40 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
12a50 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
12a60 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
12a70 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
12a80 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
12a90 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
12aa0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
12ab0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
12ac0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
12ad0 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
12ae0 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
12af0 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
12b00 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
12b10 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
12b20 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
12b30 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
12b40 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
12b50 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
12b60 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
12b70 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
12b80 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
12b90 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
12ba0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
12bb0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
12bc0 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
12bd0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
12be0 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
12bf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
12c00 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65  c>=0 ){.    vdbe
12c10 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b  InvokeSqllog(p);
12c20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12c30 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
12c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
12c50 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
12c60 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
12c70 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
12c80 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
12c90 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
12ca0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
12cb0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
12cc0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
12cd0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
12ce0 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
12cf0 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
12d00 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
12d10 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
12d20 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
12d30 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
12d40 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
12d50 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
12d60 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
12d70 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
12d80 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
12d90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
12da0 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
12db0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
12dc0 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
12dd0 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
12de0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
12df0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
12e00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12e10 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
12e20 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
12e30 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
12e40 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
12e50 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
12e60 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
12e70 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
12e80 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
12e90 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
12ea0 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
12eb0 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
12ec0 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
12ed0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
12ee0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
12ef0 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
12f00 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
12f10 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
12f20 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
12f30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
12f40 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
12f50 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
12f60 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
12f70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
12f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12f90 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
12fa0 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
12fb0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
12fc0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
12fd0 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30  tf(out, "%6d %10
12fe0 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20  lld %8lld ",.   
12ff0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
13000 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
13010 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
13020 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
13030 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
13040 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
13050 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
13060 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
13070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13080 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
13090 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
130a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
130b0 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
130c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
130d0 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
130e0 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
130f0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
13100 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
13110 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
13120 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
13130 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
13140 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
13150 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
13160 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
13170 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
13180 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
13190 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
131a0 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
131b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
131c0 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
131d0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
131e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
131f0 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
13200 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
13210 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
13220 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
13230 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
13240 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
13250 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
13260 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
13270 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13280 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
13290 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
132a0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
132b0 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
132c0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
132d0 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
132e0 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
132f0 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
13300 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
13310 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
13320 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
13330 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
13340 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
13350 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
13360 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
13370 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
13380 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
13390 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
133a0 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
133b0 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
133c0 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
133d0 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
133e0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
133f0 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
13400 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
13410 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
13420 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
13430 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
13440 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
13450 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
13460 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
13470 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
13480 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
13490 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
134a0 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
134b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
134c0 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
134d0 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
134e0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
134f0 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
13500 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 73   parameter corrs
13510 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65  ponds to bit 0 e
13520 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tc.)..*/.void sq
13530 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
13540 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64  uxData(Vdbe *pVd
13550 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  be, int iOp, int
13560 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74   mask){.  AuxDat
13570 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d  a **pp = &pVdbe-
13580 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69  >pAuxData;.  whi
13590 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41  le( *pp ){.    A
135a0 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a  uxData *pAux = *
135b0 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70  pp;.    if( (iOp
135c0 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75  <0).     || (pAu
135d0 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28  x->iOp==iOp && (
135e0 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c  pAux->iArg>31 ||
135f0 20 21 28 6d 61 73 6b 20 26 20 28 28 75 33 32 29   !(mask & ((u32)
13600 31 3c 3c 70 41 75 78 2d 3e 69 41 72 67 29 29 29  1<<pAux->iArg)))
13610 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
13620 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
13630 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
13640 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
13650 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
13660 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
13670 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
13680 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62  lite3DbFree(pVdb
13690 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  e->db, pAux);.  
136a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
136b0 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p= &pAux->pNext;
136c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
136d0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
136e0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
136f0 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73  ith the Vdbe pas
13700 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
13710 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65  d argument,.** e
13720 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74  xcept for object
13730 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69   itself, which i
13740 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
13750 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
13760 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
13770 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69  unction and sqli
13780 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20  te3VdbeDelete() 
13790 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44  is that.** VdbeD
137a0 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c  elete() also unl
137b0 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72  inks the Vdbe fr
137c0 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56  om the list of V
137d0 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Ms associated wi
137e0 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  th.** the databa
137f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e  se connection an
13800 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65  d frees the obje
13810 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f  ct itself..*/.vo
13820 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  id sqlite3VdbeCl
13830 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  earObject(sqlite
13840 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
13850 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
13860 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Sub, *pNext;.  i
13870 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
13880 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
13890 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
138a0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
138b0 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
138c0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
138d0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
138e0 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
138f0 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
13900 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
13910 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
13920 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
13930 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
13940 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
13950 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
13960 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
13970 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13980 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  pSub);.  }.  for
13990 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69  (i=p->nzVar-1; i
139a0 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65  >=0; i--) sqlite
139b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
139c0 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65  zVar[i]);.  vdbe
139d0 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
139e0 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
139f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
13a00 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b  (db, p->aLabel);
13a10 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
13a20 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
13a30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
13a40 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
13a50 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
13a60 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
13a70 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
13a80 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
13a90 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65  XPLAIN).  sqlite
13aa0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
13ab0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69  Explain);.  sqli
13ac0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13ad0 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64  >pExplain);.#end
13ae0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
13af0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
13b00 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
13b10 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
13b20 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
13b30 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
13b40 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
13b50 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
13b60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13b70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
13b80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
13b90 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
13ba0 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
13bb0 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
13bc0 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
13bd0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
13be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
13bf0 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
13c00 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
13c10 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
13c20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
13c30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
13c40 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
13c50 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
13c60 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
13c70 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
13c80 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
13c90 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
13ca0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
13cb0 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
13cc0 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
13cd0 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
13ce0 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
13cf0 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
13d00 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
13d10 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
13d20 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
13d30 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
13d40 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
13d50 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
13d60 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
13d70 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
13d80 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
13d90 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
13da0 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
13db0 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
13dc0 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
13dd0 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
13de0 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
13df0 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
13e00 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
13e10 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
13e20 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
13e30 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
13e40 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
13e50 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
13e60 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
13e70 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
13e80 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
13e90 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
13ea0 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
13eb0 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
13ec0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
13ed0 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
13ee0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13ef0 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
13f00 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
13f10 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
13f20 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
13f30 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
13f40 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
13f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
13f60 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
13f70 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
13f80 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
13f90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
13fa0 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
13fb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
13fc0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
13fd0 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
13fe0 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
13ff0 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
14000 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14010 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
14020 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
14030 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d  t;.    if( res!=
14040 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
14050 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
14060 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61      p->rowidIsVa
14070 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  lid = 1;.#ifdef 
14080 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
14090 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
140a0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
140b0 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
140c0 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
140d0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
140e0 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65  ACHE_STALE;.  }e
140f0 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73  lse if( p->pCurs
14100 6f 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  or ){.    int ha
14110 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
14120 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
14130 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
14140 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
14150 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
14160 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14170 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
14180 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
14190 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
141a0 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
141b0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
141c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
141d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
141e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
141f0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
14200 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
14210 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
14220 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14230 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
14240 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
14250 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
14260 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
14270 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14280 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
14290 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
142a0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
142b0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
142c0 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
142d0 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
142e0 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
142f0 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
14300 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
14310 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
14320 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
14330 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
14340 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
14350 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
14360 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
14370 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
14380 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
14390 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
143a0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
143b0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
143c0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
143d0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
143e0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
143f0 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
14400 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
14410 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
14420 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
14430 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
14440 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
14450 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
14460 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
14470 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
14480 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
14490 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
144a0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
144b0 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
144c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
144d0 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
144e0 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
144f0 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
14500 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
14510 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
14520 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
14530 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
14540 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
14550 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
14560 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
14570 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
14580 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
14590 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
145a0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
145b0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
145c0 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
145d0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
145e0 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
14610 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
14620 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
14630 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
14640 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
14650 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
14660 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
14670 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
14680 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
14690 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
146c0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
146d0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
146e0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
146f0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
14700 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
14730 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
14740 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
14750 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
14760 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
14770 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
14780 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
14790 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
147a0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
147b0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
147c0 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
147f0 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
14800 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
14810 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
14820 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
14830 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
14840 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
14850 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
14860 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
14870 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
14880 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
14890 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
148a0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
148b0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
148c0 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
148d0 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
148e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
148f0 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
14900 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
14910 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
14920 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14930 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
14940 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
14950 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
14960 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
14970 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
14980 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
14990 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
149a0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
149b0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
149c0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
149d0 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
149e0 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
149f0 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
14a00 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
14a10 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
14a20 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
14a30 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
14a40 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
14a50 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  i<0 ){.      if(
14a60 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20   i<(-MAX_6BYTE) 
14a70 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20  ) return 6;.    
14a80 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65    /* Previous te
14a90 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20  st prevents:  u 
14aa0 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38  = -(-92233720368
14ab0 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20  54775808) */.   
14ac0 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d     u = -i;.    }
14ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
14ae0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
14af0 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
14b00 20 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d   return ((i&1)==
14b10 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
14b20 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20  >=4) ? 8+(u32)u 
14b30 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  : 1;.    }.    i
14b40 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
14b50 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
14b60 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
14b70 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
14b80 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
14b90 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
14ba0 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
14bb0 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
14bc0 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
14bd0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
14be0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
14bf0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14c00 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
14c10 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
14c20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
14c30 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d  b) );.  n = pMem
14c40 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
14c50 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
14c60 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
14c70 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73  nZero;.  }.  ass
14c80 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
14c90 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
14ca0 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
14cb0 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
14cc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
14cd0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
14ce0 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
14cf0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
14d00 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
14d10 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
14d20 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
14d30 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
14d40 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14d50 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
14d60 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
14d70 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
14d80 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
14d90 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
14da0 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
14db0 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
14dc0 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
14dd0 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
14de0 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
14df0 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
14e00 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
14e10 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
14e20 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
14e30 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
14e40 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
14e50 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
14e60 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
14e70 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
14e80 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
14e90 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
14ea0 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
14eb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
14ec0 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
14ed0 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
14ee0 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
14ef0 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
14f00 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
14f10 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
14f20 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
14f30 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
14f40 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
14f50 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
14f60 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
14f70 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
14f80 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
14f90 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
14fa0 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
14fb0 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
14fc0 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
14fd0 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
14fe0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
14ff0 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
15000 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
15010 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
15020 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
15030 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
15040 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
15050 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
15060 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
15070 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
15080 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
15090 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
150a0 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
150b0 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
150c0 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
150d0 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
150e0 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
150f0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
15100 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
15110 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
15120 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
15130 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
15140 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
15150 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
15160 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
15170 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
15180 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
15190 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
151a0 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
151b0 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
151c0 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
151d0 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
151e0 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
151f0 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
15200 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
15210 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
15220 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
15230 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
15240 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
15250 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
15260 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
15270 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
15280 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
15290 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
152a0 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
152b0 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
152c0 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
152d0 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
152e0 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
152f0 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
15300 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
15310 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
15320 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
15330 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
15340 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
15350 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
15360 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
15370 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
15380 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
15390 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
153a0 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
153b0 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
153c0 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
153d0 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
153e0 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
153f0 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
15400 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
15410 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
15420 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
15430 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
15440 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
15450 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
15460 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
15470 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
15480 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
15490 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
154a0 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
154b0 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
154c0 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
154d0 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
154e0 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
154f0 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
15500 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
15510 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
15520 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
15530 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
15540 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
15550 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
15560 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
15570 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
15580 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
15590 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
155a0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
155b0 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
155c0 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
155d0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
155e0 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
155f0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
15600 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
15610 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
15620 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
15630 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
15640 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
15650 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
15660 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
15670 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
15680 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
15690 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
156a0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
156b0 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
156c0 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
156d0 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
156e0 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
156f0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
15700 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
15710 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
15720 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
15730 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
15740 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
15750 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
15760 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
15770 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
15780 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
15790 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
157a0 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
157b0 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
157c0 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
157d0 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
157e0 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
157f0 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
15800 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
15810 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
15820 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
15830 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
15840 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
15850 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
15860 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
15870 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
15880 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
15890 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
158a0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
158b0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
158c0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
158d0 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
158e0 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
158f0 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
15900 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
15910 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
15920 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
15930 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
15940 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
15950 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
15960 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15970 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
15980 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c  format);.  u32 l
15990 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
159a0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
159b0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
159c0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
159d0 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
159e0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
159f0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
15a00 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
15a10 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
15a20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
15a30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
15a40 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
15a50 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
15a60 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
15a70 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
15a80 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
15a90 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
15aa0 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
15ab0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15ac0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
15ad0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
15ae0 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20 29  len<=(u32)nBuf )
15af0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
15b00 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
15b10 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
15b20 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
15b30 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
15b40 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
15b50 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
15b60 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
15b70 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
15b80 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
15b90 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
15ba0 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
15bb0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
15bc0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
15bd0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
15be0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
15bf0 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
15c00 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
15c10 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
15c20 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
15c30 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
15c40 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
15c50 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
15c60 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
15c70 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
15c80 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73 73  nZero;.      ass
15c90 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a  ert( nBuf>=0 );.
15ca0 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20        if( len > 
15cb0 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20 20  (u32)nBuf ){.   
15cc0 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32 29       len = (u32)
15cd0 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nBuf;.      }.  
15ce0 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b      memset(&buf[
15cf0 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e  pMem->n], 0, len
15d00 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d  -pMem->n);.    }
15d10 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
15d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
15d30 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
15d40 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
15d50 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  0;.}../*.** Dese
15d60 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
15d70 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
15d80 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
15d90 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
15da0 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
15db0 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
15dc0 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
15dd0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
15de0 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  read..*/ .u32 sq
15df0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
15e00 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
15e10 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
15e20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
15e30 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
15e40 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
15e50 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
15e60 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
15e70 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
15e80 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
15e90 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
15ea0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
15eb0 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
15ec0 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
15ed0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
15ee0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
15ef0 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
15f00 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
15f10 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
15f20 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
15f30 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
15f40 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
15f50 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
15f60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15f70 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
15f80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15f90 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
15fa0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
15fb0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
15fc0 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64  m->u.i = (signed
15fd0 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
15fe0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15ff0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
16000 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
16010 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
16020 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
16030 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
16040 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
16050 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
16060 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
16070 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
16080 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
16090 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
160a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
160b0 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
160c0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
160d0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
160e0 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
160f0 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
16100 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
16110 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
16120 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
16130 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
16140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16150 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
16160 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
16170 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
16180 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
16190 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
161a0 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
161b0 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
161c0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
161d0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
161e0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
161f0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
16200 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
16210 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
16220 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
16230 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
16240 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
16250 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
16260 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
16270 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
16280 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
16290 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
162a0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
162b0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
162c0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
162d0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
162e0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
162f0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
16300 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
16310 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
16320 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
16330 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
16340 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a  */.      u64 x;.
16350 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66        u32 y;.#if
16360 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
16370 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
16380 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
16390 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20  NG_POINT).      
163a0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
163b0 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
163c0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
163d0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
163e0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64       ** byte ord
163f0 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
16400 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
16410 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
16420 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66   is.      ** def
16430 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
16440 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
16450 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
16460 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a  e mixed.      **
16470 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a   endian..      *
16480 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
16490 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
164a0 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
164b0 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69  <32;.      stati
164c0 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
164d0 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75  1 = 1.0;.      u
164e0 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
164f0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
16500 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
16510 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16520 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
16530 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
16540 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
16550 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
16560 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d       x = (buf[0]
16570 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
16580 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
16590 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
165a0 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c     y = (buf[4]<<
165b0 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31  24) | (buf[5]<<1
165c0 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29  6) | (buf[6]<<8)
165d0 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20   | buf[7];.     
165e0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
165f0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
16600 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
16610 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
16620 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
16630 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
16640 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
16650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16660 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16670 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
16680 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20  pMem->r)==8 );. 
16690 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64         swapMixed
166a0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
166b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
166c0 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a  pMem->r, &x, siz
166d0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20  eof(x));.       
166e0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
166f0 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
16700 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  ->r) ? MEM_Null 
16710 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  : MEM_Real;.    
16720 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
16730 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   8;.    }.    ca
16740 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
16750 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
16760 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
16770 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d  er 1 */.      pM
16780 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
16790 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
167a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
167b0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
167c0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
167d0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
167e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
167f0 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
16800 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d  M_Blob|MEM_Ephem
16810 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70  , MEM_Str|MEM_Ep
16820 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 75 33 32  hem };.      u32
16830 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
16840 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
16850 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
16860 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
16870 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
16880 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
16890 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  0;.      pMem->f
168a0 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72  lags = aFlag[ser
168b0 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20  ial_type&1];.   
168c0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
168d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
168e0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
168f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
16900 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
16910 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
16920 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
16930 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
16940 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
16950 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
16960 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
16970 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
16980 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16990 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
169a0 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
169b0 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
169c0 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
169d0 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
169e0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
169f0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
16a00 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
16a10 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
16a20 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
16a30 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
16a40 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
16a50 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
16a60 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
16a70 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
16a80 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
16a90 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
16aa0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
16ab0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
16ac0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
16ad0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
16ae0 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
16af0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
16b00 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
16b10 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
16b20 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
16b30 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
16b40 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
16b50 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
16b60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
16b70 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
16b80 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
16b90 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
16ba0 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
16bb0 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
16bc0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
16bd0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
16be0 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
16bf0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
16c00 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
16c10 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
16c20 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
16c30 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
16c40 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
16c50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16c60 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
16c70 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
16c80 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
16c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16ca0 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
16cb0 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
16cc0 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
16cd0 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
16ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
16cf0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
16d00 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
16d10 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d30 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
16d40 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
16d50 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
16d60 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
16d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16d80 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
16d90 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
16da0 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
16db0 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
16dc0 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
16dd0 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
16de0 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
16df0 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
16e00 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
16e10 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
16e20 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
16e30 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
16e40 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
16e50 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
16e60 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
16e70 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
16e80 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
16e90 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
16ea0 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
16eb0 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
16ec0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
16ed0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
16ee0 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
16ef0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
16f00 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
16f10 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
16f20 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
16f30 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
16f40 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
16f50 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
16f60 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
16f70 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
16f80 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
16f90 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16fa0 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
16fb0 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
16fc0 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
16fd0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
16fe0 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
16ff0 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
17000 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
17010 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
17020 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
17030 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
17040 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
17050 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
17060 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
17070 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
17080 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
17090 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
170a0 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
170b0 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
170c0 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
170d0 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
170e0 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
170f0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
17100 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
17110 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
17120 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
17130 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
17140 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
17150 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
17160 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17170 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
17180 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
17190 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
171a0 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
171b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
171c0 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
171d0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
171e0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
171f0 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
17200 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
17210 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
17220 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
17230 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
17240 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17250 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
17260 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
17270 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
17280 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
17290 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
172a0 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
172c0 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
172d0 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
172e0 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
17310 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
17320 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
17330 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
17340 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20  em;..  p->flags 
17350 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
17360 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
17370 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
17380 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
17390 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
173a0 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
173b0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
173c0 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
173d0 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
173e0 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
173f0 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
17400 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
17410 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
17420 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
17430 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
17440 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
17450 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
17460 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
17470 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
17480 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
17490 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
174a0 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
174b0 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  /.    pMem->zMal
174c0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
174d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
174e0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
174f0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
17500 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
17510 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
17520 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
17530 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
17540 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
17550 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   u;.}../*.** Thi
17560 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
17570 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
17580 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
17590 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
175a0 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
175b0 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
175c0 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
175d0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
175e0 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
175f0 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
17600 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
17610 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
17620 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
17630 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
17640 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
17650 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
17660 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
17670 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
17680 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
17690 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
176a0 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
176b0 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
176c0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
176d0 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
176e0 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
176f0 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
17700 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
17710 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
17720 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20   fields..** The 
17730 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66  key with fewer f
17740 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79  ields is usually
17750 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74   compares less t
17760 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67  han the .** long
17770 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72  er key.  However
17780 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
17790 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69  _INCRKEY flags i
177a0 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a  n pPKey2 is set.
177b0 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  ** and the commo
177c0 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65  n prefixes are e
177d0 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20  qual, then key1 
177e0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79  is less than key
177f0 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20  2..** Or if the 
17800 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50  UNPACKED_MATCH_P
17810 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65  REFIX flag is se
17820 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78  t and the prefix
17830 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  es are.** equal,
17840 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61   then the keys a
17850 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
17860 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a   be equal and.**
17870 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e   the parts beyon
17880 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
17890 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  fix are ignored.
178a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
178b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
178c0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
178d0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
178e0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
178f0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
17900 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
17910 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
17920 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
17930 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
17940 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
17950 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
17960 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
17970 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
17980 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
17990 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
179a0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
179b0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
179c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
179d0 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
179e0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
179f0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
17a00 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17a10 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
17a20 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
17a30 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
17a40 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
17a50 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
17a60 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
17a70 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31  pKeyInfo;.  mem1
17a80 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
17a90 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
17aa0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
17ab0 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
17ac0 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
17ad0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
17ae0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17af0 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
17b00 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  ONLY( mem1.zMall
17b10 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
17b20 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
17b30 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
17b40 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
17b50 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
17b60 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
17b70 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
17b80 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
17b90 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
17ba0 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
17bb0 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
17bc0 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
17bd0 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
17be0 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
17bf0 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
17c00 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
17c10 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
17c20 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
17c30 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
17c40 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
17c50 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
17c60 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
17c70 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
17c80 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
17c90 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
17ca0 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
17cb0 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
17cc0 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
17cd0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
17ce0 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
17cf0 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
17d00 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
17d10 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
17d20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
17d30 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
17d40 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
17d50 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
17d60 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
17d70 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
17d80 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
17d90 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
17da0 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
17db0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
17dc0 6e 46 69 65 6c 64 20 29 3b 0a 20 20 61 73 73 65  nField );.  asse
17dd0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
17de0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
17df0 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
17e00 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
17e10 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
17e20 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
17e30 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
17e40 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
17e50 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
17e60 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
17e70 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
17e80 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
17e90 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
17ea0 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
17eb0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
17ec0 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
17ed0 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
17ee0 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
17ef0 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
17f00 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
17f10 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
17f20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
17f30 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
17f40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
17f50 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
17f60 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
17f70 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
17f80 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
17f90 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
17fa0 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
17fb0 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
17fc0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
17fd0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
17fe0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
17ff0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
18000 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
18010 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
18020 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
18030 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18040 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
18050 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
18060 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
18070 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18080 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
18090 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
180a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
180b0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
180c0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
180d0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
180e0 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
180f0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
18100 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
18110 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
18120 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
18130 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
18140 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
18150 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
18160 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
18170 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
18180 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
18190 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
181a0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
181b0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
181c0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
181d0 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72  = -rc;  /* Inver
181e0 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  t the result for
181f0 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
18200 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
18210 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18220 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
18230 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
18240 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
18250 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
18260 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
18270 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
18280 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
18290 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
182a0 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
182b0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
182c0 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
182d0 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
182e0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
182f0 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
18300 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
18310 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
18320 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
18330 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
18340 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
18350 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
18360 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
18370 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
18380 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
18390 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
183a0 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67  NCRKEY.  ** flag
183b0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72   is set, then br
183c0 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74  eak the tie by t
183d0 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20  reating key2 as 
183e0 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20  larger..  ** If 
183f0 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46  the UPACKED_PREF
18400 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73  IX_MATCH flag is
18410 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20   set, then keys 
18420 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66  with common pref
18430 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ixes.  ** are co
18440 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
18450 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  qual.  Otherwise
18460 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79  , the longer key
18470 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61   is the .  ** la
18480 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70  rger.  As it hap
18490 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32  pens, the pPKey2
184a0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
184b0 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20  the longer.  ** 
184c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
184d0 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
184e0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
184f0 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
18500 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
18510 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20  _INCRKEY ){.    
18520 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  rc = -1;.  }else
18530 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
18540 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
18550 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
18560 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30    /* Leave rc==0
18570 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
18580 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20  idx1<szHdr1 ){. 
18590 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
185a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
185b0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
185c0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
185d0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
185e0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
185f0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
18600 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
18610 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
18620 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
18630 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
18640 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
18650 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
18660 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
18670 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
18680 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
18690 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
186a0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
186b0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
186c0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
186d0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
186e0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
186f0 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
18700 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
18710 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
18720 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18730 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
18740 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
18750 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
18760 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
18770 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
18780 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
18790 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
187a0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
187b0 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
187c0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
187d0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
187e0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
187f0 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
18800 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
18810 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
18820 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18830 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
18840 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
18850 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
18860 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
18870 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
18880 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
18890 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
188a0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
188b0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
188c0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
188d0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
188e0 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
188f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
18900 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
18910 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
18920 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
18930 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
18940 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
18950 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18960 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
18970 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
18980 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
18990 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
189a0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
189b0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
189c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
189d0 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
189e0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
189f0 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
18a00 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
18a10 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
18a20 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
18a30 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
18a40 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
18a50 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
18a60 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
18a70 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ry */.  memset(&
18a80 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
18a90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18aa0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
18ab0 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e  (pCur, 0, (int)n
18ac0 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
18ad0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
18ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18af0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
18b00 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
18b10 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
18b20 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
18b30 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
18b40 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
18b50 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
18b60 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
18b70 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
18b80 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
18b90 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
18ba0 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
18bb0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
18bc0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
18bd0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
18be0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
18bf0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
18c00 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
18c10 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
18c20 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
18c30 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
18c40 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
18c50 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
18c60 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
18c70 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
18c80 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18c90 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
18ca0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18cb0 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
18cc0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
18cd0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18ce0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
18cf0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
18d00 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
18d10 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
18d20 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
18d30 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
18d40 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18d50 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
18d60 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
18d70 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
18d80 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
18d90 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
18da0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
18db0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
18dc0 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
18dd0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
18de0 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
18df0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
18e00 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
18e10 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
18e20 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
18e30 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
18e40 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
18e50 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
18e60 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
18e70 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
18e80 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
18e90 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
18ea0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
18eb0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
18ec0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
18ed0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
18ee0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
18ef0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
18f00 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
18f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18f20 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
18f30 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
18f40 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
18f50 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
18f60 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
18f70 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
18f80 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
18f90 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18fa0 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
18fb0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
18fc0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
18fd0 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
18fe0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
18ff0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
19000 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19010 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
19020 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
19030 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
19040 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
19050 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
19060 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
19070 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
19080 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
19090 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
190a0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
190b0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
190c0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
190d0 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
190e0 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
190f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
19100 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
19110 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
19120 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
19130 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
19140 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
19150 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
19160 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
19170 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
19180 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
19190 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
191a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
191b0 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
191c0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
191d0 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
191e0 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
191f0 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
19200 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
19210 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
19220 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
19230 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
19240 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
19250 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
19260 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  (.  VdbeCursor *
19270 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
19280 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
19290 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
192a0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
192b0 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
192c0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
192d0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20  rsion of key to 
192e0 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
192f0 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
19320 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
19330 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
19340 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
19350 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
19360 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
19370 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d  pCursor;.  Mem m
19380 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
19390 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
193a0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
193b0 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
193c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
193d0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
193e0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
193f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19400 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
19410 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
19420 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
19430 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
19440 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
19450 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
19460 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
19470 61 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a  ause of the say.
19480 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
19490 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
194a0 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
194b0 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
194c0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
194d0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
194e0 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
194f0 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
19500 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
19510 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19520 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  PT;.  }.  memset
19530 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
19540 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
19550 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
19560 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
19570 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
19580 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
19590 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
195a0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
195b0 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
195c0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
195d0 52 45 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20  REFIX_MATCH );. 
195e0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
195f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
19600 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
19610 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
19620 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
19630 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
19640 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
19660 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
19670 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
19680 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
19690 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
196a0 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
196b0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
196c0 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
196d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
196e0 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
196f0 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
19700 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19710 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
19720 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
19730 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
19740 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
19750 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
19760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
19770 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
19780 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
19790 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
197a0 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
197b0 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
197c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
197d0 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
197e0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
197f0 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
19800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
19810 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
19820 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
19830 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
19840 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
19850 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
19860 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
19870 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
19880 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
19890 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
198a0 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
198b0 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
198c0 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
198d0 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
198e0 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
198f0 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
19900 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
19910 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
19920 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
19930 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
19940 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
19950 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
19960 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
19970 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
19980 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
19990 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
199a0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
199b0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
199c0 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
199d0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
199e0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
199f0 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
19a00 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
19a10 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
19a20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
19a30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
19a40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19a50 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
19a60 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
19a70 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
19a80 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
19a90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
19aa0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
19ab0 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
19ac0 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
19ad0 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
19ae0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
19af0 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
19b00 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
19b10 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
19b20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
19b30 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
19b40 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
19b50 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
19b60 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
19b70 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
19b80 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
19b90 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
19ba0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
19bb0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
19bc0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
19bd0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
19be0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19bf0 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
19c00 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
19c10 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
19c20 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
19c30 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
19c40 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
19c50 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
19c60 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
19c70 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
19c80 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
19c90 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
19ca0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19cb0 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
19cc0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
19cd0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
19ce0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
19cf0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
19d00 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
19d10 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
19d20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
19d30 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
19d40 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
19d50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19d60 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79  e3VdbeMemStoreTy
19d70 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b  pe((Mem *)pRet);
19d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19d90 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
19da0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
19db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
19dc0 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
19dd0 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
19de0 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
19df0 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
19e00 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
19e10 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
19e20 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
19e30 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
19e40 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
19e50 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
19e60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19e70 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
19e80 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
19e90 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
19ea0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
19eb0 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
19ec0 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
19ed0 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
19ee0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
19ef0 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
19f00 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  r-1));.  }.}..#i
19f10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19f20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
19f30 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72  *.** Transfer er
19f40 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
19f50 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33   from an sqlite3
19f60 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74  _vtab.zErrMsg (t
19f70 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
19f80 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
19f90 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
19fa0 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62  lloc) into a Vdb
19fb0 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  e.zErrMsg (text 
19fc0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
19fd0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
19fe0 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
19ff0 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
1a000 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
1a010 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c  msg(Vdbe *p, sql
1a020 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1a030 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1a040 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69   = p->db;.  sqli
1a050 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
1a060 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
1a070 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
1a080 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56  3DbStrDup(db, pV
1a090 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
1a0a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
1a0b0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
1a0c0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
1a0d0 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  = 0;.}.#endif /*
1a0e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1a0f0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a           TUALTABLE */.