/ Hex Artifact Content
Login

Artifact f4ed66c45336e42e7f1bdaccf7586c84eba06bac:


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 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
4510: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
4520: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63  OR_HINTS.      c
4530: 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20  ase P4_EXPR: {. 
4540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
4550: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78  prDelete(db, (Ex
4560: 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  pr*)p4);.       
4570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4580: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73  #endif.      cas
4590: 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a  e P4_MPRINTF: {.
45a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
45b0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
45c0: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
45d0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
45e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
45f0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
4600: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
4610: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
4620: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
4630: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4640: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4650: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
4660: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4670: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
4690: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
46a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
46b0: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
46c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  e{.          Mem
46d0: 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a   *p = (Mem*)p4;.
46e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
46f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
4700: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
4710: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4720: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
4730: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
4740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4750: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b  case P4_VTAB : {
4760: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4770: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4780: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
4790: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
47a0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
47b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
47c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
47d0: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  ee the space all
47e0: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61  ocated for aOp a
47f0: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73  nd any p4 values
4800: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
4810: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f  he.** opcodes co
4820: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20  ntained within. 
4830: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55  If aOp is not NU
4840: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  LL it is assumed
4850: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20   to contain .** 
4860: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f  nOp entries. .*/
4870: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
4880: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
4890: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f  ite3 *db, Op *aO
48a0: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69  p, int nOp){.  i
48b0: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70  f( aOp ){.    Op
48c0: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70   *pOp;.    for(p
48d0: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70  Op=aOp; pOp<&aOp
48e0: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20  [nOp]; pOp++){. 
48f0: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
4900: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
4910: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
4920: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
4930: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
4940: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4950: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
4960: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
4970: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73    .    }.  }.  s
4980: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4990: 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOp);.}../*.** 
49a0: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67  Link the SubProg
49b0: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ram object passe
49c0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
49d0: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68  argument into th
49e0: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74  e linked.** list
49f0: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f   at Vdbe.pSubPro
4a00: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20  gram. This list 
4a10: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74  is used to delet
4a20: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61  e all sub-progra
4a30: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65  m.** objects whe
4a40: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c  n the VM is no l
4a50: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
4a60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4a70: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61  dbeLinkSubProgra
4a80: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  m(Vdbe *pVdbe, S
4a90: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20  ubProgram *p){. 
4aa0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62   p->pNext = pVdb
4ab0: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  e->pProgram;.  p
4ac0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  Vdbe->pProgram =
4ad0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   p;.}../*.** Cha
4ae0: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61  nge the opcode a
4af0: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e  t addr into OP_N
4b00: 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  oop.*/.void sqli
4b10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
4b20: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
4b30: 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70 2d   addr){.  if( p-
4b40: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
4b50: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
4b60: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
4b70: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4b80: 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c  ;.    freeP4(db,
4b90: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4ba0: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65  p->p4.p);.    me
4bb0: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
4bc0: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
4bd0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
4be0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28  OP_Noop;.    if(
4bf0: 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20   addr==p->nOp-1 
4c00: 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a  ) p->nOp--;.  }.
4c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4c20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4c30: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
4c40: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
4c50: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4c60: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
4c70: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
4c80: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
4c90: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4ca0: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4cc0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
4cd0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
4ce0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
4cf0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
4d00: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
4d10: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4d20: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4d30: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4d40: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4d50: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4d60: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4d70: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4d80: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4d90: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4da0: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4db0: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4dc0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
4dd0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
4de0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
4df0: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
4e00: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
4e10: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41  ues of n (P4_STA
4e20: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20  TIC, P4_COLLSEQ 
4e30: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
4e40: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a  hat zP4 points.*
4e50: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
4e60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
4e70: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
4e80: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
4e90: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
4ea0: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
4eb0: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
4ec0: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
4ed0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
4ee0: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
4ef0: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
4f00: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
4f10: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
4f20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4f30: 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20  beChangeP4(Vdbe 
4f40: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
4f50: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69  nst char *zP4, i
4f60: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
4f70: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
4f80: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4f90: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
4fa0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
4fb0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
4fc0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
4fd0: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp==0 || db->m
4fe0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4ff0: 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41     if( n!=P4_VTA
5000: 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  B ){.      freeP
5010: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
5020: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
5030: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5040: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5050: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
5060: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
5070: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
5080: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
5090: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
50a0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
50b0: 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72 74 28  addr];.  assert(
50c0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
50d0: 5f 4e 4f 54 55 53 45 44 20 7c 7c 20 70 4f 70 2d  _NOTUSED || pOp-
50e0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
50f0: 32 20 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62  2 );.  freeP4(db
5100: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5110: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
5120: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
5130: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
5140: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
5150: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
5160: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
5170: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
5180: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
5190: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
51a0: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
51b0: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
51c0: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
51d0: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
51e0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
51f0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
5200: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
5210: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
5220: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
5230: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
5240: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
5250: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
5260: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5270: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5280: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5290: 4b 45 59 49 4e 46 4f 3b 0a 23 69 66 64 65 66 20  KEYINFO;.#ifdef 
52a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
52b0: 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 7d 65 6c  RSOR_HINTS.  }el
52c0: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 45 58 50  se if( n==P4_EXP
52d0: 52 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 73 70  R ){.    /* Resp
52e0: 6f 6e 73 69 62 69 6c 69 74 79 20 66 6f 72 20 64  onsibility for d
52f0: 65 6c 65 74 69 6e 67 20 74 68 65 20 45 78 70 72  eleting the Expr
5300: 20 74 72 65 65 20 69 73 20 68 61 6e 64 65 64 20   tree is handed 
5310: 6f 76 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  over to the.    
5320: 2a 2a 20 56 44 42 45 20 62 79 20 74 68 69 73 20  ** VDBE by this 
5330: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  operation.  The 
5340: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61  caller should ha
5350: 76 65 20 61 6c 72 65 61 64 79 20 69 6e 76 6f 6b  ve already invok
5360: 65 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  ed.    ** sqlite
5370: 33 45 78 70 72 44 75 70 28 29 20 6f 72 20 77 68  3ExprDup() or wh
5380: 61 74 65 76 65 72 20 6f 74 68 65 72 20 72 6f 75  atever other rou
5390: 74 69 6e 65 20 69 73 20 6e 65 65 64 65 64 20 74  tine is needed t
53a0: 6f 20 6d 61 6b 65 20 61 20 0a 20 20 20 20 2a 2a  o make a .    **
53b0: 20 70 72 69 76 61 74 65 20 63 6f 70 79 20 6f 66   private copy of
53c0: 20 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20 20   the tree. */.  
53d0: 20 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 20    pOp->p4.pExpr 
53e0: 3d 20 28 45 78 70 72 2a 29 7a 50 34 3b 0a 20 20  = (Expr*)zP4;.  
53f0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5400: 50 34 5f 45 58 50 52 3b 0a 23 65 6e 64 69 66 0a  P4_EXPR;.#endif.
5410: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5420: 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f  4_VTAB ){.    pO
5430: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5440: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5450: 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b  4type = P4_VTAB;
5460: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
5470: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a  Lock((VTable *)z
5480: 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  P4);.    assert(
5490: 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29   ((VTable *)zP4)
54a0: 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ->db==p->db );. 
54b0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29   }else if( n<0 )
54c0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
54d0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
54e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
54f0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
5500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
5510: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69   n==0 ) n = sqli
5520: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29  te3Strlen30(zP4)
5530: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ;.    pOp->p4.z 
5540: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
5550: 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e  up(p->db, zP4, n
5560: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
5570: 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b  pe = P4_DYNAMIC;
5580: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
5590: 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20  t the P4 on the 
55a0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
55b0: 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  ded opcode to th
55c0: 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68  e KeyInfo for th
55d0: 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e  e.** index given
55e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
55f0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
5600: 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
5610: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
5620: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
5630: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
5640: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
5650: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
5660: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
5670: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
5680: 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
5690: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
56a0: 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20  e, pIdx),.      
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a  P4_KEYINFO);.}..
56d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
56e0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
56f0: 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  MENTS./*.** Chan
5700: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
5710: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5720: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
5730: 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e  ction.  Or.** in
5740: 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64  sert a No-op and
5750: 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74   add the comment
5760: 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73   to that new ins
5770: 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a  truction.  This.
5780: 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64  ** makes the cod
5790: 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64  e easier to read
57a0: 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e   during debuggin
57b0: 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73  g.  None of this
57c0: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61   happens.** in a
57d0: 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
57e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
57f0: 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56  d vdbeVComment(V
5800: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
5810: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f  ar *zFormat, va_
5820: 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65  list ap){.  asse
5830: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
5840: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
5850: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
5860: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
5870: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
5880: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
5890: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
58a0: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61   p->nOp ){.    a
58b0: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b  ssert( p->aOp );
58c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
58d0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  ee(p->db, p->aOp
58e0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
58f0: 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  ent);.    p->aOp
5900: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
5910: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  ent = sqlite3VMP
5920: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
5930: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d  rmat, ap);.  }.}
5940: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5950: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
5960: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
5970: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
5980: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
5990: 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61   p ){.    va_sta
59a0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
59b0: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
59c0: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
59d0: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
59e0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
59f0: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
5a00: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
5a10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5a20: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
5a30: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
5a40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
5a50: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
5a60: 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  op);.    va_star
5a70: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
5a80: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
5a90: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
5aa0: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
5ab0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
5ac0: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
5ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
5ae0: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
5af0: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74  n address.  If t
5b00: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31  he address is -1
5b10: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
5b20: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5b30: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f  ly inserted opco
5b40: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  de..**.** If a m
5b50: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5b60: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
5b70: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  red prior to the
5b80: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73   calling of this
5b90: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  .** routine, the
5ba0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5bb0: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69   dummy VdbeOp wi
5bc0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
5bd0: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20   That opcode.** 
5be0: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20  is readable but 
5bf0: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
5c00: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20  ough it is cast 
5c10: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61  to a writable va
5c20: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  lue..** The retu
5c30: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70  rn of a dummy op
5c40: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  code allows the 
5c50: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65  call to continue
5c60: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20   functioning.** 
5c70: 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c  after a OOM faul
5c80: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
5c90: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
5ca0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
5cb0: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
5cc0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
5cd0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
5ce0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
5cf0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
5d00: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
5d10: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
5d20: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
5d30: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
5d40: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
5d50: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
5d60: 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75  rind..**.** Abou
5d70: 74 20 74 68 65 20 23 69 66 64 65 66 20 53 51 4c  t the #ifdef SQL
5d80: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20  ITE_OMIT_TRACE: 
5d90: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
5da0: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
5db0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73   called.** unles
5dc0: 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69  s p->nOp>0.  Thi
5dd0: 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
5de0: 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53  the absense of S
5df0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5e00: 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65  ,.** an OP_Trace
5e10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
5e20: 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64 20  always inserted 
5e30: 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  by sqlite3VdbeGe
5e40: 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a  t() as soon as.*
5e50: 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69 73 20  * a new VDBE is 
5e60: 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20  created.  So we 
5e70: 61 72 65 20 66 72 65 65 20 74 6f 20 73 65 74 20  are free to set 
5e80: 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31  addr to p->nOp-1
5e90: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
5ea0: 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65  ng to double-che
5eb0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
5ec0: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
5ed0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  is non-negative.
5ee0: 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54   But.** if SQLIT
5ef0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20  E_OMIT_TRACE is 
5f00: 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f  defined, the OP_
5f10: 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64  Trace is omitted
5f20: 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20   and we do need 
5f30: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20  to.** check the 
5f40: 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d  value of p->nOp-
5f50: 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  1 before continu
5f60: 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ing..*/.VdbeOp *
5f70: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5f80: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
5f90: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
5fa0: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
5fb0: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
5fc0: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
5fd0: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
5fe0: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
5ff0: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
6000: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
6010: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
6020: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
6030: 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f  VdbeOp dummy;  /
6040: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56  * Ignore the MSV
6050: 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  C warning about 
6060: 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  no initializer *
6070: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  /.  assert( p->m
6080: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
6090: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61  _INIT );.  if( a
60a0: 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65 66 20  ddr<0 ){.#ifdef 
60b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
60c0: 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70  E.    if( p->nOp
60d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 56 64  ==0 ) return (Vd
60e0: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 23 65  beOp*)&dummy;.#e
60f0: 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20 3d 20  ndif.    addr = 
6100: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
6110: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
6120: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
6130: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
6140: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
6150: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
6160: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
6170: 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64  turn (VdbeOp*)&d
6180: 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ummy;.  }else{. 
6190: 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f     return &p->aO
61a0: 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a  p[addr];.  }.}..
61b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
61c0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
61d0: 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a  N_COMMENTS)./*.*
61e0: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
61f0: 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e  ger value for on
6200: 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  e of the paramet
6210: 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64  ers to the opcod
6220: 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69  e pOp.** determi
6230: 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72  ned by character
6240: 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   c..*/.static in
6250: 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61  t translateP(cha
6260: 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70  r c, const Op *p
6270: 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31  Op){.  if( c=='1
6280: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
6290: 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27  p1;.  if( c=='2'
62a0: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
62b0: 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20  2;.  if( c=='3' 
62c0: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33  ) return pOp->p3
62d0: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29  ;.  if( c=='4' )
62e0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e   return pOp->p4.
62f0: 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d  i;.  return pOp-
6300: 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  >p5;.}../*.** Co
6310: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66  mpute a string f
6320: 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22  or the "comment"
6330: 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45   field of a VDBE
6340: 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 0a   opcode listing.
6350: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
6360: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20  splayComment(.  
6370: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20  const Op *pOp,  
6380: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6390: 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64   to be commented
63a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
63b0: 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76   *zP4,   /* Prev
63c0: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
63d0: 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a  value for P4 */.
63e0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20    char *zTemp,  
63f0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
6400: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  sult here */.  i
6410: 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20  nt nTemp        
6420: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
6430: 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20  able in zTemp[] 
6440: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
6450: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63  ar *zOpName;.  c
6460: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f  onst char *zSyno
6470: 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e  psis;.  int nOpN
6480: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  ame;.  int ii, j
6490: 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  j;.  zOpName = s
64a0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
64b0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
64c0: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
64d0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
64e0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
64f0: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
6500: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
6510: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
6520: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
6530: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
6540: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f  Name + 1;.    fo
6550: 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54  r(ii=jj=0; jj<nT
6560: 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53  emp-1 && (c = zS
6570: 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b  ynopsis[ii])!=0;
6580: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
6590: 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20  ( c=='P' ){.    
65a0: 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69      c = zSynopsi
65b0: 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20  s[++ii];.       
65c0: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20   if( c=='4' ){. 
65d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
65e0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
65f0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
6600: 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20  s", zP4);.      
6610: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
6620: 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  X' ){.          
6630: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6640: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
6650: 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  +jj, "%s", pOp->
6660: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
6670: 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31       seenCom = 1
6680: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6690: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
66a0: 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63  1 = translateP(c
66b0: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
66c0: 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20    int v2;.      
66d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
66e0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
66f0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76  Temp+jj, "%d", v
6700: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
6710: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
6720: 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20  sis+ii+1, "@P", 
6730: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
6740: 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20       ii += 3;.  
6750: 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20            jj += 
6760: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6770: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
6780: 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e         v2 = tran
6790: 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73  slateP(zSynopsis
67a0: 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20  [ii], pOp);.    
67b0: 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31          if( v2>1
67c0: 20 29 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69   ) sqlite3_snpri
67d0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
67e0: 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20  emp+jj, "..%d", 
67f0: 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20  v1+v2-1);.      
6800: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
6810: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
6820: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
6830: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
6840: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6850: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
6860: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6870: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
6880: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
6890: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
68a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
68b0: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
68c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
68d0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
68e0: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
68f0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
6900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6910: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6920: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
6930: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
6940: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
6950: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6960: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
6970: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
6980: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
6990: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
69a0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
69b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
69c0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
69d0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
69e0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
69f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6a00: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
6a10: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
6a20: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
6a30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
6a40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6a50: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
6a60: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  f VDBE_DISPLAY_P
6a70: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  4 && defined(SQL
6a80: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
6a90: 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54  R_HINTS)./*.** T
6aa0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e  ranslate the P4.
6ab0: 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20  pExpr value for 
6ac0: 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74  an OP_CursorHint
6ad0: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78   opcode into tex
6ae0: 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65  t.** that can be
6af0: 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68   displayed in th
6b00: 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45  e P4 column of E
6b10: 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a  XPLAIN output..*
6b20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
6b30: 70 6c 61 79 50 34 45 78 70 72 28 69 6e 74 20 6e  playP4Expr(int n
6b40: 54 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  Temp, char *zTem
6b50: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
6b60: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6b70: 42 69 6e 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69  BinOp = 0;.  swi
6b80: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
6b90: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  {.    case TK_ST
6ba0: 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69  RING:.      sqli
6bb0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6bc0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 51 22 2c  mp, zTemp, "%Q",
6bd0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
6be0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6bf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
6c00: 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69  EGER:.      sqli
6c10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6c20: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
6c30: 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
6c40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6c50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
6c60: 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  L:.      sqlite3
6c70: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6c80: 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b   zTemp, "NULL");
6c90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
6ca0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
6cb0: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
6cc0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6cd0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 72 5b 25  emp, zTemp, "r[%
6ce0: 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  d]", pExpr->iTab
6cf0: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
6d00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
6d10: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
6d20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6d30: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6d40: 6d 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29  mp, "c%d", (int)
6d50: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
6d60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6d70: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
6d80: 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _LT:      zBinOp
6d90: 20 3d 20 22 3c 22 3b 20 20 20 20 20 20 20 20 62   = "<";        b
6da0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6db0: 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_LE:      zBinO
6dc0: 70 20 3d 20 22 3c 3d 22 3b 20 20 20 20 20 20 20  p = "<=";       
6dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6de0: 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GT:      zBin
6df0: 4f 70 20 3d 20 22 3e 22 3b 20 20 20 20 20 20 20  Op = ">";       
6e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6e10: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69   TK_GE:      zBi
6e20: 6e 4f 70 20 3d 20 22 3e 3d 22 3b 20 20 20 20 20  nOp = ">=";     
6e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6e40: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42  e TK_NE:      zB
6e50: 69 6e 4f 70 20 3d 20 22 21 3d 22 3b 20 20 20 20  inOp = "!=";    
6e60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
6e70: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
6e80: 42 69 6e 4f 70 20 3d 20 22 3d 3d 22 3b 20 20 20  BinOp = "==";   
6e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
6ea0: 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
6eb0: 7a 42 69 6e 4f 70 20 3d 20 22 20 49 53 20 22 3b  zBinOp = " IS ";
6ec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ed0: 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20  case TK_ISNOT:  
6ee0: 20 7a 42 69 6e 4f 70 20 3d 20 22 20 49 53 20 4e   zBinOp = " IS N
6ef0: 4f 54 20 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OT "; break;.   
6f00: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
6f10: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 20 41 4e 44    zBinOp = " AND
6f20: 20 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   ";    break;.  
6f30: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
6f40: 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 20 4f 52     zBinOp = " OR
6f50: 20 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   ";     break;. 
6f60: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
6f70: 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 2b 22      zBinOp = "+"
6f80: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
6f90: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
6fa0: 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 2a  :    zBinOp = "*
6fb0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
6fc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
6fd0: 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  US:   zBinOp = "
6fe0: 2d 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  -";        break
6ff0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
7000: 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  M:     zBinOp = 
7010: 22 25 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  "%";        brea
7020: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
7030: 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d  ITAND:  zBinOp =
7040: 20 22 26 22 3b 20 20 20 20 20 20 20 20 62 72 65   "&";        bre
7050: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7060: 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20  BITOR:   zBinOp 
7070: 3d 20 22 7c 22 3b 20 20 20 20 20 20 20 20 62 72  = "|";        br
7080: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7090: 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70  _SLASH:   zBinOp
70a0: 20 3d 20 22 2f 22 3b 20 20 20 20 20 20 20 20 62   = "/";        b
70b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
70c0: 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f  K_LSHIFT:  zBinO
70d0: 70 20 3d 20 22 3c 3c 22 3b 20 20 20 20 20 20 20  p = "<<";       
70e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
70f0: 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_RSHIFT:  zBin
7100: 4f 70 20 3d 20 22 3e 3e 22 3b 20 20 20 20 20 20  Op = ">>";      
7110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7120: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69   TK_CONCAT:  zBi
7130: 6e 4f 70 20 3d 20 22 7c 7c 22 3b 20 20 20 20 20  nOp = "||";     
7140: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
7150: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c  fault:.      sql
7160: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7170: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
7180: 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20  , "expr");.     
7190: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
71a0: 66 28 20 7a 42 69 6e 4f 70 20 26 26 20 6e 54 65  f( zBinOp && nTe
71b0: 6d 70 3e 35 20 29 7b 0a 20 20 20 20 69 6e 74 20  mp>5 ){.    int 
71c0: 6e 20 3d 20 31 3b 0a 20 20 20 20 7a 54 65 6d 70  n = 1;.    zTemp
71d0: 5b 30 5d 20 3d 20 27 28 27 3b 0a 20 20 20 20 6e  [0] = '(';.    n
71e0: 20 2b 3d 20 64 69 73 70 6c 61 79 50 34 45 78 70   += displayP4Exp
71f0: 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70  r(nTemp-n, zTemp
7200: 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  +n, pExpr->pLeft
7210: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
7220: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6e 2c  nprintf(nTemp-n,
7230: 20 7a 54 65 6d 70 2b 6e 2c 20 22 25 73 22 2c 20   zTemp+n, "%s", 
7240: 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 6e 20 2b  zBinOp);.    n +
7250: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7260: 30 28 7a 54 65 6d 70 2b 6e 29 3b 0a 20 20 20 20  0(zTemp+n);.    
7270: 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50 34 45 78  n += displayP4Ex
7280: 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d  pr(nTemp-n, zTem
7290: 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  p+n, pExpr->pRig
72a0: 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ht);.    sqlite3
72b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
72c0: 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22 29  n, zTemp+n, ")")
72d0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
72e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
72f0: 7a 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  zTemp);.}.#endif
7300: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
7310: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
7320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
7330: 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a  SOR_HINTS) */...
7340: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
7350: 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  _P4./*.** Comput
7360: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
7370: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34  describes the P4
7380: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
7390: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
73a0: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
73b0: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
73c0: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
73d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
73e0: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f  displayP4(Op *pO
73f0: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
7400: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
7410: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b  ar *zP4 = zTemp;
7420: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
7430: 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68  >=20 );.  switch
7440: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
7450: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
7460: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
7470: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
7480: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
7490: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
74a0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
74b0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
74c0: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
74d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
74e0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
74f0: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
7500: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
7510: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
7520: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
7530: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
7540: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
7550: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7560: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
7570: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
7580: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  [j];.        con
7590: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
75a0: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
75b0: 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20  zName : "nil";. 
75c0: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
75d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
75e0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
75f0: 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d  f( n==6 && memcm
7600: 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22  p(zColl,"BINARY"
7610: 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,6)==0 ){.      
7620: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b      zColl = "B";
7630: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31  .          n = 1
7640: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7650: 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d      if( i+n>nTem
7660: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
7670: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
7680: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
7690: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
76a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
76b0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
76c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
76d0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
76e0: 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[j] ){.       
76f0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
7700: 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  '-';.        }. 
7710: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
7720: 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20  Temp[i], zColl, 
7730: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20  n+1);.        i 
7740: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += n;.      }.  
7750: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
7760: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
7770: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
7780: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
7790: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
77a0: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
77b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
77c0: 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65  R_HINTS.    case
77d0: 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20   P4_EXPR: {.    
77e0: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28    displayP4Expr(
77f0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 70 4f  nTemp, zTemp, pO
7800: 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20  p->p4.pExpr);.  
7810: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7820: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
7830: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
7840: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
7850: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
7860: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
7870: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7880: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30  p, zTemp, "(%.20
7890: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
78a0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
78b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
78c0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
78d0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
78e0: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
78f0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
7900: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7910: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
7920: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
7930: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
7940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7950: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
7960: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7970: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7980: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
7990: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
79a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
79b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
79c0: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
79d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
79e0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
79f0: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
7a00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7a10: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
7a20: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
7a30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7a40: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
7a50: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
7a60: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
7a70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7a80: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
7a90: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
7aa0: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
7ab0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7ac0: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
7ad0: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
7ae0: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
7af0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7b00: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
7b10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7b20: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7b30: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
7b40: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
7b50: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7b60: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
7b70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7b80: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7b90: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
7ba0: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
7bb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7bc0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7bd0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
7be0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7bf0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7c00: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65  NULL");.      }e
7c10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7c20: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ert( pMem->flags
7c30: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
7c40: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62         zP4 = "(b
7c50: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  lob)";.      }. 
7c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c70: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7c80: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7c90: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
7ca0: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
7cb0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
7cc0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
7cd0: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73  ->pVtab;.      s
7ce0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7cf0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76  nTemp, zTemp, "v
7d00: 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61  tab:%p:%p", pVta
7d10: 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  b, pVtab->pModul
7d20: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7d30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
7d40: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
7d50: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
7d60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7d70: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61  mp, zTemp, "inta
7d80: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72  rray");.      br
7d90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7da0: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
7db0: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
7dc0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7dd0: 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72  p, zTemp, "progr
7de0: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  am");.      brea
7df0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7e00: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
7e10: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
7e20: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
7e30: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
7e40: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
7e50: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
7e60: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
7e70: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
7e80: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
7e90: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
7ea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7eb0: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
7ec0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
7ed0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45  }.#endif /* VDBE
7ee0: 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a  _DISPLAY_P4 */..
7ef0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
7f00: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
7f10: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
7f20: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
7f30: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
7f40: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
7f50: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
7f60: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
7f70: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
7f80: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
7f90: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
7fa0: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
7fb0: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
7fc0: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
7fd0: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
7fe0: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
7ff0: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
8000: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
8010: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
8020: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
8030: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
8040: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
8050: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
8060: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
8070: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
8080: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
8090: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
80a0: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
80b0: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
80c0: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
80d0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d  eMask)*8 );.  p-
80e0: 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28  >btreeMask |= ((
80f0: 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  yDbMask)1)<<i;. 
8100: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
8110: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
8120: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
8130: 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6c  pBt) ){.    p->l
8140: 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62  ockMask |= ((yDb
8150: 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a  Mask)1)<<i;.  }.
8160: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
8170: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
8180: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
8190: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
81a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
81b0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
81c0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
81d0: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
81e0: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
81f0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
8200: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
8210: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
8220: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
8230: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
8240: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
8250: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
8260: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
8270: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
8280: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
8290: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
82a0: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
82b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
82c0: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
82d0: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
82e0: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
82f0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
8300: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
8310: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
8320: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
8330: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
8340: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
8350: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
8360: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
8370: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
8380: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
8390: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
83a0: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
83b0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
83c0: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
83d0: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
83e0: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
83f0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
8400: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
8410: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
8420: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
8430: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
8440: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
8450: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
8460: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
8470: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
8480: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
8490: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
84a0: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
84b0: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
84c0: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
84d0: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
84e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
84f0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
8500: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
8510: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
8520: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
8530: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
8540: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
8550: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
8560: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
8570: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
8580: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
8590: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
85a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
85b0: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
85c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79  p){.  int i;.  y
85d0: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73  DbMask mask;.  s
85e0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
85f0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
8600: 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d  ;.  if( p->lockM
8610: 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ask==0 ) return;
8620: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
8630: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
8640: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
8650: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
8660: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
8670: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62  0, mask=1; i<nDb
8680: 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d  ; i++, mask += m
8690: 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  ask){.    if( i!
86a0: 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d  =1 && (mask & p-
86b0: 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26  >lockMask)!=0 &&
86c0: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
86d0: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
86e0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
86f0: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
8700: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
8710: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
8720: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
8730: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
8740: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
8750: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
8760: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
8770: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
8780: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
8790: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
87a0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
87b0: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65  e3VdbeLeave(Vdbe
87c0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
87d0: 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20   yDbMask mask;. 
87e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
87f0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
8800: 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63  Db;.  if( p->loc
8810: 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72  kMask==0 ) retur
8820: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
8830: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
8840: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
8850: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
8860: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
8870: 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e  i=0, mask=1; i<n
8880: 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d  Db; i++, mask +=
8890: 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20   mask){.    if( 
88a0: 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20  i!=1 && (mask & 
88b0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20  p->lockMask)!=0 
88c0: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
88d0: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
88e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
88f0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
8900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
8910: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
8920: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
8930: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
8940: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
8950: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
8960: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
8970: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
8980: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
8990: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
89a0: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
89b0: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
89c0: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
89d0: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
89e0: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f  [50];.  char zCo
89f0: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63  m[100];.  static
8a00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
8a10: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
8a20: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
8a30: 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  -13s %.2X %s\n";
8a40: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
8a50: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
8a60: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
8a70: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
8a80: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64  eof(zPtr));.#ifd
8a90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8aa0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
8ab0: 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  S.  displayComme
8ac0: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f  nt(pOp, zP4, zCo
8ad0: 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29  m, sizeof(zCom))
8ae0: 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30  ;.#else.  zCom[0
8af0: 5d 20 3d 20 30 0a 23 65 6e 64 69 66 0a 20 20 66  ] = 0.#endif.  f
8b00: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
8b10: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
8b20: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
8b30: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
8b40: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
8b50: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
8b60: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20  , pOp->p5,.     
8b70: 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c   zCom.  );.  ffl
8b80: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
8b90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
8ba0: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
8bb0: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
8bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
8bd0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
8be0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
8bf0: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
8c00: 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20   Mem *pEnd;.    
8c10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
8c20: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  >db;.    u8 mall
8c30: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
8c40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
8c50: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
8c60: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
8c70: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
8c80: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
8c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8ca0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
8cb0: 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oc);.      }.   
8cc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8cd0: 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70  .    for(pEnd=&p
8ce0: 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [N]; p<pEnd; p++
8cf0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8d00: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
8d10: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
8d20: 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  db );..      /* 
8d30: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
8d40: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
8d50: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
8d60: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
8d70: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
8d80: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
8d90: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
8da0: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
8db0: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
8dc0: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
8dd0: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
8de0: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
8df0: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
8e00: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
8e10: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
8e20: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
8e30: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
8e40: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
8e50: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
8e60: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
8e70: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
8e80: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
8e90: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
8ea0: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
8eb0: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
8ec0: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
8ed0: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
8ee0: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
8ef0: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
8f00: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
8f10: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
8f20: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
8f30: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
8f40: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
8f50: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
8f60: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
8f70: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
8f80: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
8f90: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
8fa0: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
8fb0: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
8fc0: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
8fd0: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
8fe0: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
8ff0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
9000: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
9010: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
9020: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
9030: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
9040: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9050: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
9060: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
9070: 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >zMalloc ){.    
9080: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9090: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
90a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d  );.        p->zM
90b0: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
90c0: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
90d0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64  gs = MEM_Invalid
90e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
90f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d  mallocFailed = m
9100: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20  alloc_failed;.  
9110: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
9120: 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62  e a VdbeFrame ob
9130: 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e  ject and its con
9140: 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65  tents. VdbeFrame
9150: 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20   objects are.** 
9160: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65  allocated by the
9170: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
9180: 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62  de in sqlite3Vdb
9190: 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64  eExec()..*/.void
91a0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
91b0: 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d  eDelete(VdbeFram
91c0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
91d0: 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64    Mem *aMem = Vd
91e0: 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20  beFrameMem(p);. 
91f0: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70   VdbeCursor **ap
9200: 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f  Csr = (VdbeCurso
9210: 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43  r **)&aMem[p->nC
9220: 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28  hildMem];.  for(
9230: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64  i=0; i<p->nChild
9240: 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Csr; i++){.    s
9250: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
9260: 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72  rsor(p->v, apCsr
9270: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  [i]);.  }.  rele
9280: 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d  aseMemArray(aMem
9290: 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b  , p->nChildMem);
92a0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
92b0: 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d  (p->v->db, p);.}
92c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
92d0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
92e0: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
92f0: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
9300: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
9310: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
9320: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
9330: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
9340: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
9350: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
9360: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
9370: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
9380: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
9390: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
93a0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
93b0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
93c0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
93d0: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
93e0: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
93f0: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
9400: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
9410: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
9420: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
9430: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
9440: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
9450: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
9460: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
9470: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
9480: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
9490: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
94a0: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
94b0: 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   PLAN..**.** Whe
94c0: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
94d0: 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20   first the main 
94e0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65  program is liste
94f0: 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a  d, then each of.
9500: 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73  ** the trigger s
9510: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c  ubprograms are l
9520: 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65  isted one by one
9530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9540: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
9550: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
9560: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
9570: 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  E */.){.  int nR
9580: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
95a0: 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20  * Stop when row 
95b0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68  count reaches th
95c0: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  is */.  int nSub
95d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
95f0: 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64  Number of sub-vd
9600: 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20  bes seen so far 
9610: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
9620: 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20  **apSub = 0;    
9630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
9640: 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  ay of sub-vdbes 
9650: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d  */.  Mem *pSub =
9660: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
9680: 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72  ory cell hold ar
9690: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20  ray of subprogs 
96a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
96b0: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
96c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
96d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
96e0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  tion */.  int i;
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9710: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
9720: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
9730: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
9740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9750: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
9760: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
9770: 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  m[1];           
9780: 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f    /* First Mem o
9790: 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  f result set */.
97a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
97b0: 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72  plain );.  asser
97c0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
97d0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20  E_MAGIC_RUN );. 
97e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
97f0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
9800: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
9810: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
9820: 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20  _NOMEM );..  /* 
9830: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73  Even though this
9840: 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74   opcode does not
9850: 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72   use dynamic str
9860: 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ings for.  ** th
9870: 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74  e result, result
9880: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63   columns may bec
9890: 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74  ome dynamic if t
98a0: 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20  he user calls.  
98b0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
98c0: 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73  n_text16(), caus
98d0: 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f  ing a translatio
98e0: 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f  n to UTF-16 enco
98f0: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  ding..  */.  rel
9900: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65  easeMemArray(pMe
9910: 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73  m, 8);.  p->pRes
9920: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69  ultSet = 0;..  i
9930: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9940: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a  _NOMEM ){.    /*
9950: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
9960: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69   a malloc() insi
9970: 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  de a call to sql
9980: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
9990: 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  () or.    ** sql
99a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
99b0: 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f  16() failed.  */
99c0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
99d0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  ailed = 1;.    r
99e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
99f0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  OR;.  }..  /* Wh
9a00: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
9a10: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61   output rows rea
9a20: 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20  ches nRow, that 
9a30: 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c  means the.  ** l
9a40: 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73  isting has finis
9a50: 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  hed and sqlite3_
9a60: 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65  step() should re
9a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9a80: 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74  ..  ** nRow is t
9a90: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
9aa0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
9ab0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
9ac0: 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20  , plus.  ** the 
9ad0: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
9ae0: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c  r of rows in all
9af0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
9b00: 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rams encountered
9b10: 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54  .  ** so far.  T
9b20: 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69  he nRow value wi
9b30: 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e  ll increase as n
9b40: 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ew trigger subpr
9b50: 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20  ograms are.  ** 
9b60: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74  encountered, but
9b70: 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e   p->pc will even
9b80: 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20  tually catch up 
9b90: 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20  to nRow..  */.  
9ba0: 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  nRow = p->nOp;. 
9bb0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
9bc0: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =1 ){.    /* The
9bd0: 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20   first 8 memory 
9be0: 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66  cells are used f
9bf0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
9c00: 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20  t.  So we will. 
9c10: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72     ** commandeer
9c20: 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f   the 9th cell to
9c30: 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20   use as storage 
9c40: 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20  for an array of 
9c50: 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20  pointers.    ** 
9c60: 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72  to trigger subpr
9c70: 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42  ograms.  The VDB
9c80: 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  E is guaranteed 
9c90: 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  to have at least
9ca0: 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e   9.    ** cells.
9cb0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
9cc0: 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20   p->nMem>9 );.  
9cd0: 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65    pSub = &p->aMe
9ce0: 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  m[9];.    if( pS
9cf0: 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c  ub->flags&MEM_Bl
9d00: 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ob ){.      /* O
9d10: 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  n the first call
9d20: 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
9d30: 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f  (), pSub will ho
9d40: 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69  ld a NULL.  It i
9d50: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69  s.      ** initi
9d60: 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42  alized to a BLOB
9d70: 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52   by the P4_SUBPR
9d80: 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67  OGRAM processing
9d90: 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a   logic below */.
9da0: 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75        nSub = pSu
9db0: 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65  b->n/sizeof(Vdbe
9dc0: 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20  *);.      apSub 
9dd0: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
9de0: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a  )pSub->z;.    }.
9df0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9e00: 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Sub; i++){.     
9e10: 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69   nRow += apSub[i
9e20: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
9e30: 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  }..  do{.    i =
9e40: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
9e50: 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d  le( i<nRow && p-
9e60: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70  >explain==2 && p
9e70: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
9e80: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
9e90: 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a   if( i>=nRow ){.
9ea0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
9eb0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
9ec0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
9ed0: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
9ee0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
9ef0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
9f00: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
9f10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
9f20: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
9f30: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
9f40: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
9f50: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
9f60: 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  p->rc));.  }else
9f70: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b  {.    char *zP4;
9f80: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
9f90: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
9fa0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
9fb0: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
9fc0: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
9fd0: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
9fe0: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
9ff0: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
a000: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
a010: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
a020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
a030: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
a040: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
a050: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
a060: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
a070: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
a080: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
a090: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
a0a0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a0b0: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
a0c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61     for(j=0; i>=a
a0d0: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b  pSub[j]->nOp; j+
a0e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d  +){.        i -=
a0f0: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a   apSub[j]->nOp;.
a100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
a110: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61  p = &apSub[j]->a
a120: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Op[i];.    }.   
a130: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
a140: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
a150: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a160: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  t;.      pMem->t
a170: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
a180: 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d  EGER;.      pMem
a190: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
a1c0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
a1d0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
a1e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a1f0: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
a200: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
a210: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
a220: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
a230: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
a240: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
a250: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
a260: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
a270: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
a280: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a290: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
a2a0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
a2b0: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
a2c0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
a2d0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
a2e0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
a2f0: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
a300: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
a310: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
a320: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
a330: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
a340: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
a350: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
a360: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
a370: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
a380: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
a390: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
a3a0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
a3b0: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
a3c0: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
a3d0: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
a3e0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
a3f0: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
a400: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
a410: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
a420: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
a430: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
a440: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
a450: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a460: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
a470: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
a480: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
a490: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
a4a0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
a4b0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
a4c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
a4d0: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
a4e0: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
a4f0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
a500: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
a510: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
a520: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
a530: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
a540: 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53          apSub[nS
a550: 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ub++] = pOp->p4.
a560: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
a570: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
a580: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
a590: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
a5a0: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
a5b0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
a5c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a5d0: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
a5e0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
a5f0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
a600: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
a630: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
a640: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
a650: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
a660: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a670: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
a680: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
a6b0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
a6c0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
a6d0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a6e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a6f0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
a700: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
a730: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
a740: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
a750: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
a760: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
a770: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
a780: 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20   32, 0) ){      
a790: 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20        /* P4 */. 
a7a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a7b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a7c0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
a7d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
a7e0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66     }.    pMem->f
a7f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
a800: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
a810: 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  .    zP4 = displ
a820: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
a830: 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20  z, 32);.    if( 
a840: 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  zP4!=pMem->z ){.
a850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a860: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
a870: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
a880: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
a890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
a8a0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
a8b0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
a8c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a8d0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
a8e0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
a8f0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
a900: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
a910: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
a920: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a930: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
a940: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
a950: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
a960: 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b  w(pMem, 4, 0) ){
a970: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a980: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
a990: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
a9a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
a9b0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
a9c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a9d0: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
a9e0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a9f0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
aa00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
aa10: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
aa20: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
aa30: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
aa40: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
aa50: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
aa60: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
aa70: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
aa80: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
aa90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
aaa0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
aab0: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
aac0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
aad0: 28 70 4d 65 6d 2c 20 35 30 30 2c 20 30 29 20 29  (pMem, 500, 0) )
aae0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
aaf0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
ab00: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
ab10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
ab20: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
ab30: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ab40: 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74  = MEM_Dyn|MEM_St
ab50: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
ab60: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
ab70: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
ab80: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
ab90: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
aba0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
abb0: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
abc0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
abd0: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
abe0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
abf0: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac10: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  Comment */.     
ac20: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
ac30: 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 23 65 6e 64 69  LITE_NULL;.#endi
ac40: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
ac50: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
ac60: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
ac70: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
ac80: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
ac90: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
aca0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
acb0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
acc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
acd0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ace0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
acf0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ad00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
ad10: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
ad20: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
ad30: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
ad40: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
ad50: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
ad60: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
ad70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
ad80: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
ad90: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
ada0: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
adb0: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
adc0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
add0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
ade0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
adf0: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26  code==OP_Trace &
ae00: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
ae10: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d  {.      z = pOp-
ae20: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69  >p4.z;.      whi
ae30: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
ae40: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
ae50: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20    }.  }.  if( z 
ae60: 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b  ) printf("SQL: [
ae70: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65  %s]\n", z);.}.#e
ae80: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
ae90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
aea0: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
aeb0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
aec0: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
aed0: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
aee0: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
aef0: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
af00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
af10: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
af20: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
af30: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
af40: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
af50: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
af60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
af70: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
af80: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
af90: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
afa0: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26  code==OP_Trace &
afb0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
afc0: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
afd0: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
afe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
aff0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
b000: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
b010: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
b020: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
b030: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
b040: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
b050: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
b060: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
b070: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
b080: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
b090: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
b0a0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
b0b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b0c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
b0d0: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
b0e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
b0f0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
b100: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
b110: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
b120: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
b130: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
b140: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
b150: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  IOTRACE */../*.*
b160: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
b170: 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69   from a fixed si
b180: 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65  ze buffer and re
b190: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b1a0: 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e  o.** that space.
b1b0: 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e    If insufficien
b1c0: 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  t space is avail
b1d0: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  able, return NUL
b1e0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75  L..**.** The pBu
b1f0: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  f parameter is t
b200: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b210: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68   of a pointer wh
b220: 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65  ich will.** rece
b230: 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f  ive the new memo
b240: 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72  ry.  pBuf is nor
b250: 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20  mally NULL.  If 
b260: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
b270: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
b280: 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  at memory space 
b290: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b2a0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
b2b0: 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hat.** this rout
b2c0: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61  ine should not a
b2d0: 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20  llocate any new 
b2e0: 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42  memory.  When pB
b2f0: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
b300: 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  L simply return 
b310: 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f  pBuf.  Only allo
b320: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
b330: 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a  space when pBuf.
b340: 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ** is NULL..**.*
b350: 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e  * nByte is the n
b360: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
b370: 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a  f space needed..
b380: 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f  **.** *ppFrom po
b390: 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c  ints to availabl
b3a0: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
b3b0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
b3c0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
b3d0: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57  ilable space.  W
b3e0: 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c  hen space is all
b3f0: 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20  ocated, *ppFrom 
b400: 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74  is advanced past
b410: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
b420: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  he allocated spa
b430: 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74  ce..**.** *pnByt
b440: 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  e is a counter o
b450: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b460: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
b470: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
b480: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
b490: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
b4a0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
b4b0: 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61  in *ppFrom to sa
b4c0: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71  tisfy the.** req
b4d0: 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65  uest, then incre
b4e0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20  ment *pnByte by 
b4f0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
b500: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
b510: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
b520: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
b530: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
b540: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
b550: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
b560: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
b570: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
b580: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b590: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
b5a0: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
b5b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
b5c0: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
b5d0: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
b5e0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b5f0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b600: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
b610: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
b620: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
b630: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
b640: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
b650: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
b660: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
b670: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  yte */.){.  asse
b680: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
b690: 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d  LIGNMENT(*ppFrom
b6a0: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20  ) );.  if( pBuf 
b6b0: 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20  ) return pBuf;. 
b6c0: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
b6d0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28  nByte);.  if( &(
b6e0: 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20  *ppFrom)[nByte] 
b6f0: 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70  <= pEnd ){.    p
b700: 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70  Buf = (void*)*pp
b710: 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f  From;.    *ppFro
b720: 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65  m += nByte;.  }e
b730: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65  lse{.    *pnByte
b740: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20   += nByte;.  }. 
b750: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
b760: 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68  ./*.** Rewind th
b770: 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74  e VDBE back to t
b780: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20  he beginning in 
b790: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a  preparation for.
b7a0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a  ** running it..*
b7b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b7c0: 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70  beRewind(Vdbe *p
b7d0: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
b7e0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
b7f0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
b800: 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
b810: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
b820: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
b830: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
b840: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
b850: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
b860: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
b870: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
b880: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
b890: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
b8a0: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
b8b0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
b8c0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
b8d0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
b8e0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b8f0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
b900: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
b910: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=1; i<p->nMem; 
b920: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
b930: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
b940: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
b950: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
b960: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
b970: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
b980: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
b990: 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ort;.  p->magic 
b9a0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
b9b0: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
b9c0: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
b9d0: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
b9e0: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
b9f0: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
ba00: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
ba10: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
ba20: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
ba30: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
ba40: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
ba50: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
ba60: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
ba70: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
ba80: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
ba90: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
baa0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
bab0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
bac0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
bad0: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
bae0: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
baf0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
bb00: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
bb10: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
bb20: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
bb30: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
bb40: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
bb50: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
bb60: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
bb70: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
bb80: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
bb90: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
bba0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
bbb0: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
bbc0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bbd0: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
bbe0: 61 63 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61  act once on a ea
bbf0: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
bc00: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
bc10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bc20: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
bc30: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
bc40: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
bc50: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
bc60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
bc70: 6c 6c 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c  lled, futher cal
bc80: 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
bc90: 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e  3VdbeAddOp() fun
bca0: 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69  ctions are prohi
bcb0: 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75  bited.  This rou
bcc0: 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73  tine disconnects
bcd0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f  .** the Vdbe fro
bce0: 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
bcf0: 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67  ct that helped g
bd00: 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68  enerate it so th
bd10: 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64  at the.** the Vd
bd20: 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e  be becomes an in
bd30: 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79  dependent entity
bd40: 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f   and the Parse o
bd50: 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20  bject can be.** 
bd60: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
bd70: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
bd80: 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f  VdbeRewind() pro
bd90: 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72  cedure to restor
bda0: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
bdb0: 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69  ine back.** to i
bdc0: 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65  ts initial state
bdd0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
bde0: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  en run..*/.void 
bdf0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
be00: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
be30: 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  BE */.  Parse *p
be40: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
be50: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
be60: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
be70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
bea0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
beb0: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
bee0: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ameters */.  int
bef0: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bf10: 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f  umber of VM memo
bf20: 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ry registers */.
bf30: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
bf60: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a  rsors required *
bf70: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bfa0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62  arguments in sub
bfb0: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
bfc0: 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20  t nOnce;        
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bfe0: 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63  Number of OP_Onc
bff0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a  e instructions *
c000: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c030: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72  er */.  u8 *zCsr
c040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c050: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
c060: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
c070: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  llocation */.  u
c080: 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *zEnd;        
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0a0: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
c0b0: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
c0c0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  y */.  int nByte
c0d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c0e0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
c0f0: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69  h extra memory i
c100: 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61  s needed */..  a
c110: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
c120: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
c130: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c140: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
c150: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
c160: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
c170: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
c180: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
c190: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
c1a0: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
c1b0: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
c1c0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
c1d0: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
c1e0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
c1f0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
c200: 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50  rg;.  nOnce = pP
c210: 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69  arse->nOnce;.  i
c220: 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f  f( nOnce==0 ) nO
c230: 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75  nce = 1; /* Ensu
c240: 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  re at least one 
c250: 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65  byte in p->aOnce
c260: 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f  Flag[] */.  .  /
c270: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
c280: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
c290: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
c2a0: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
c2b0: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
c2c0: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
c2d0: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
c2e0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
c2f0: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
c300: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
c310: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
c320: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
c330: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65  ce for.  ** Vdbe
c340: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
c350: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
c360: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
c370: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
c380: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
c390: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
c3a0: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
c3b0: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
c3c0: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
c3d0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
c3e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c3f0: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
c400: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
c410: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
c420: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
c430: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
c440: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
c450: 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65  ce for memory re
c460: 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72  gisters, SQL var
c470: 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72  iables, VDBE cur
c480: 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61  sors and .  ** a
c490: 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68  n array to marsh
c4a0: 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  al SQL function 
c4b0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20  arguments in..  
c4c0: 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a  */.  zCsr = (u8*
c4d0: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  )&p->aOp[p->nOp]
c4e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72  ;       /* Memor
c4f0: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20  y avaliable for 
c500: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
c510: 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zEnd = (u8*)&p->
c520: 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d  aOp[p->nOpAlloc]
c530: 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65  ;  /* First byte
c540: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73   past end of zCs
c550: 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76  r[] */..  resolv
c560: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
c570: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
c580: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
c590: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
c5a0: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
c5b0: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
c5c0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
c5d0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
c5e0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
c5f0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72   }.  memset(zCsr
c600: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
c610: 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72  .  zCsr += (zCsr
c620: 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20   - (u8*)0)&7;.  
c630: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
c640: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73  TE_ALIGNMENT(zCs
c650: 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72  r) );.  p->expir
c660: 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65  ed = 0;..  /* Me
c670: 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65  mory for registe
c680: 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20  rs, parameters, 
c690: 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20  cursor, etc, is 
c6a0: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f  allocated in two
c6b0: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
c6c0: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
c6d0: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
c6e0: 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  e unused space a
c6f0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
c700: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
c710: 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
c720: 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
c730: 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
c740: 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
c750: 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
c760: 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
c770: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
c780: 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
c790: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
c7a0: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
c7b0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
c7c0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
c7d0: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
c7e0: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
c7f0: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
c800: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
c810: 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63  he leftover spac
c820: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
c830: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
c840: 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
c850: 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
c860: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
c870: 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
c880: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
c890: 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20  ..  */.  do {.  
c8a0: 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    nByte = 0;.   
c8b0: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
c8c0: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
c8d0: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
c8e0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
c8f0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56  Byte);.    p->aV
c900: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
c910: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
c920: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
c930: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c940: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
c950: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
c960: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
c970: 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  (Mem*), &zCsr, z
c980: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c990: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c    p->azVar = all
c9a0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72  ocSpace(p->azVar
c9b0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  , nVar*sizeof(ch
c9c0: 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  ar*), &zCsr, zEn
c9d0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
c9e0: 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63  p->apCsr = alloc
c9f0: 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20  Space(p->apCsr, 
ca00: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
ca10: 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20  dbeCursor*),.   
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45         &zCsr, zE
ca40: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
ca50: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   p->aOnceFlag = 
ca60: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f  allocSpace(p->aO
ca70: 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20  nceFlag, nOnce, 
ca80: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
ca90: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  yte);.    if( nB
caa0: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  yte ){.      p->
cab0: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
cac0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
cad0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
cae0: 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65    zCsr = p->pFre
caf0: 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a  e;.    zEnd = &z
cb00: 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77  Csr[nByte];.  }w
cb10: 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21  hile( nByte && !
cb20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cb30: 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f   );..  p->nCurso
cb40: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70  r = nCursor;.  p
cb50: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f  ->nOnceFlag = nO
cb60: 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56  nce;.  if( p->aV
cb70: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ar ){.    p->nVa
cb80: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
cb90: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
cba0: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
cbb0: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
cbc0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
cbd0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
cbe0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
cbf0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61   }.  if( p->azVa
cc00: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61  r ){.    p->nzVa
cc10: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61  r = pParse->nzVa
cc20: 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  r;.    memcpy(p-
cc30: 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  >azVar, pParse->
cc40: 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a  azVar, p->nzVar*
cc50: 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b  sizeof(p->azVar[
cc60: 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  0]));.    memset
cc70: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20  (pParse->azVar, 
cc80: 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72  0, pParse->nzVar
cc90: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
cca0: 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a  azVar[0]));.  }.
ccb0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
ccc0: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20  .    p->aMem--; 
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67       /* aMem[] g
ccf0: 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d  oes from 1..nMem
cd00: 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   */.    p->nMem 
cd10: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  = nMem;         
cd20: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20          /*      
cd30: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65   not from 0..nMe
cd40: 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e  m-1 */.    for(n
cd50: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b  =1; n<=nMem; n++
cd60: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
cd70: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
cd80: 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70  Invalid;.      p
cd90: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64  ->aMem[n].db = d
cda0: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  b;.    }.  }.  p
cdb0: 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72  ->explain = pPar
cdc0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73  se->explain;.  s
cdd0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
cde0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (p);.}../*.** Cl
cdf0: 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f  ose a VDBE curso
ce00: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
ce10: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
ce20: 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20  that cursor .** 
ce30: 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e  happens to hold.
ce40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ce50: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56  VdbeFreeCursor(V
ce60: 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73  dbe *p, VdbeCurs
ce70: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
ce80: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
ce90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
cea0: 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
ceb0: 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
cec0: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
ced0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
cee0: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
cef0: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43  );.    /* The pC
cf00: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
cf10: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
cf20: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
cf30: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20  ists, by.    ** 
cf40: 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
cf50: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  */.  }else if( p
cf60: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
cf70: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
cf80: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
cf90: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  pCursor);.  }.#i
cfa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cfb0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
cfc0: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
cfd0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
cfe0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
cff0: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
d000: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
d010: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
d020: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
d030: 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f  ule = pVtabCurso
d040: 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
d050: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
d060: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
d070: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
d080: 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
d090: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
d0a0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
d0b0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  f.}../*.** Copy 
d0c0: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
d0d0: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
d0e0: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
d0f0: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
d100: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
d110: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
d120: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
d130: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
d140: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
d150: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
d160: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
d170: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
d180: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
d190: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
d1a0: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
d1b0: 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67  ;.  v->aOnceFlag
d1c0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65   = pFrame->aOnce
d1d0: 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65  Flag;.  v->nOnce
d1e0: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  Flag = pFrame->n
d1f0: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61  OnceFlag;.  v->a
d200: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
d210: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
d220: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
d230: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
d240: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
d250: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
d260: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
d270: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
d280: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
d290: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
d2a0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
d2b0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
d2c0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
d2d0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
d2e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
d2f0: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
d300: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
d310: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
d320: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
d330: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
d340: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
d350: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
d360: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
d370: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
d380: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
d390: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
d3a0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
d3b0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
d3c0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
d3d0: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
d3e0: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
d3f0: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
d400: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
d410: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
d420: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
d430: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
d440: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
d450: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
d460: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
d470: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
d480: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
d490: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
d4a0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
d4b0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a  re(pFrame);.  }.
d4c0: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
d4d0: 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30  .  p->nFrame = 0
d4e0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ;..  if( p->apCs
d4f0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
d500: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d510: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
d520: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
d530: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
d540: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
d550: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
d560: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
d570: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
d580: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
d590: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d5a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
d5b0: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
d5c0: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
d5d0: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
d5e0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
d5f0: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
d600: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
d610: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
d620: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
d630: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
d640: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
d650: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
d660: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
d670: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
d680: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
d690: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
d6a0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  /.  sqlite3VdbeD
d6b0: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20  eleteAuxData(p, 
d6c0: 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  -1, 0);.  assert
d6d0: 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30  ( p->pAuxData==0
d6e0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   );.}../*.** Cle
d6f0: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
d700: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a  er execution..**
d710: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d720: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
d730: 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75  lly close any cu
d740: 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e  rsors, lists, an
d750: 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20  d/or.** sorters 
d760: 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f  that were left o
d770: 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65  pen.  It also de
d780: 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73  letes the values
d790: 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73   of.** variables
d7a0: 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61   in the aVar[] a
d7b0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
d7c0: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
d7d0: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
d7e0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23   *db = p->db;..#
d7f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
d800: 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
d810: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
d820: 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
d830: 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
d840: 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
d850: 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
d860: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
d870: 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
d880: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  */.  int i;.  if
d890: 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72  ( p->apCsr ) for
d8a0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
d8b0: 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  or; i++) assert(
d8c0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20   p->apCsr[i]==0 
d8d0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
d8e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
d8f0: 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b   i<=p->nMem; i++
d900: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
d910: 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
d920: 49 6e 76 61 6c 69 64 20 29 3b 0a 20 20 7d 0a 23  Invalid );.  }.#
d930: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
d940: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
d950: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
d960: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
d970: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
d980: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d990: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
d9a0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
d9b0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
d9c0: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
d9d0: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
d9e0: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
d9f0: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
da00: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
da10: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
da20: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
da30: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
da40: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
da50: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
da60: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
da70: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
da80: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
da90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
daa0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
dab0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
dac0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
dad0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
dae0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
daf0: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
db00: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
db10: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
db20: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
db30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
db40: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
db50: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
db60: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
db70: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
db80: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
db90: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
dba0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
dbb0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
dbc0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
dbd0: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
dbe0: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
dbf0: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
dc00: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
dc10: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
dc20: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
dc30: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
dc40: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
dc50: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
dc60: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
dc70: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
dc80: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
dc90: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
dca0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
dcb0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
dcc0: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
dcd0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
dce0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
dcf0: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
dd00: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
dd10: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
dd20: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
dd30: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
dd40: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
dd50: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
dd60: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
dd70: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
dd80: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
dd90: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
dda0: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
ddb0: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
ddc0: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
ddd0: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
dde0: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
ddf0: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
de00: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
de10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
de20: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
de50: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
de60: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
de90: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
dea0: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
deb0: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
dee0: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
def0: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
df00: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
df10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
df20: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
df30: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
df40: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
df50: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
df60: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
df70: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
df80: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
df90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
dfa0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
dfb0: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
dfc0: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
dfd0: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
dfe0: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
dff0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e000: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
e010: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
e020: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
e030: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e040: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e050: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
e060: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
e070: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
e080: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
e090: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
e0a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
e0b0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
e0c0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
e0d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
e0e0: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
e0f0: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
e100: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
e110: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
e120: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e130: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
e140: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
e150: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
e160: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
e170: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e180: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
e190: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
e1a0: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
e1b0: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
e1c0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e1d0: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
e1e0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
e1f0: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
e200: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
e210: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
e220: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
e230: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
e240: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
e250: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
e260: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
e270: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
e280: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
e290: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
e2a0: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
e2b0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
e2c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e2d0: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
e2e0: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
e2f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e300: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
e310: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
e320: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
e330: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
e340: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
e350: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
e360: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
e370: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e380: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
e390: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
e3a0: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
e3b0: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
e3c0: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
e3d0: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
e3e0: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
e3f0: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
e400: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
e410: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
e420: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
e430: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
e440: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e450: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
e460: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
e470: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
e480: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
e490: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
e4a0: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
e4b0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
e4c0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
e4d0: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54  (db, p);..  /* T
e4e0: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
e4f0: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
e500: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
e510: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
e520: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
e530: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
e540: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
e550: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
e560: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
e570: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
e580: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
e590: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
e5a0: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
e5b0: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
e5c0: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
e5d0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e5e0: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
e5f0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e600: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
e610: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
e620: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
e630: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e640: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
e650: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
e660: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e670: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
e680: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
e690: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
e6a0: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
e6b0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
e6c0: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
e6d0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e6e0: 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
e6f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e700: 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
e710: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
e720: 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
e730: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
e740: 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
e750: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
e760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
e770: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
e780: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
e790: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
e7a0: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
e7b0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
e7c0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
e7d0: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
e7e0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
e7f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
e800: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
e810: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
e820: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
e830: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e840: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
e850: 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d  OMMITHOOK;.    }
e860: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
e870: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
e880: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
e890: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
e8a0: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
e8b0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
e8c0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
e8d0: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
e8e0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
e8f0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
e900: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
e910: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
e920: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
e930: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
e940: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
e950: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
e960: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
e970: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e980: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
e990: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
e9a0: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
e9b0: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
e9c0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
e9d0: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
e9e0: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
e9f0: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
ea00: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
ea10: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
ea20: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
ea30: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
ea40: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
ea50: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
ea60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
ea70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
ea80: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
ea90: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
eaa0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
eab0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
eac0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ead0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
eae0: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
eaf0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
eb00: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
eb10: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
eb20: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
eb30: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
eb40: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
eb50: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
eb60: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
eb70: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
eb80: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
eb90: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
eba0: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
ebb0: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
ebc0: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
ebd0: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
ebe0: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
ebf0: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
ec00: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
ec10: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
ec20: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
ec30: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
ec40: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
ec50: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
ec60: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
ec70: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
ec80: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
ec90: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
eca0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ecb0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
ecc0: 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20  seTwo(pBt, 0);. 
ecd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ece0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ecf0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
ed00: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
ed10: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ed20: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
ed30: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
ed40: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
ed50: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
ed60: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
ed70: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
ed80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
ed90: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
eda0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
edb0: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
edc0: 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  cly..  */.#ifnde
edd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
ede0: 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
edf0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
ee00: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
ee10: 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
ee20: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
ee30: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
ee40: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
ee50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ee60: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
ee70: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
ee80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
ee90: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
eea0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
eeb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
eec0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
eed0: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
eee0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
eef0: 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30  t retryCount = 0
ef00: 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46  ;.    int nMainF
ef10: 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  ile;..    /* Sel
ef20: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
ef30: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
ef40: 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20  /.    nMainFile 
ef50: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
ef60: 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  0(zMainFile);.  
ef70: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
ef80: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
ef90: 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22  %s-mjXXXXXX9XXz"
efa0: 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  , zMainFile);.  
efb0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30    if( zMaster==0
efc0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
efd0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b  _NOMEM;.    do {
efe0: 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
eff0: 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  om;.      if( re
f000: 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  tryCount ){.    
f010: 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
f020: 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  nt>100 ){.      
f030: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
f040: 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
f050: 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d   delete: %s", zM
f060: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
f070: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
f080: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
f090: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62   0);.          b
f0a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
f0b0: 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75  lse if( retryCou
f0c0: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  nt==1 ){.       
f0d0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
f0e0: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
f0f0: 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d  collide: %s", zM
f100: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
f110: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f120: 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20  retryCount++;.  
f130: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
f140: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
f150: 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
f160: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f170: 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a  _snprintf(13, &z
f180: 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65  Master[nMainFile
f190: 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58  ], "-mj%06X9%02X
f1a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30    (iRandom>>8)&0
f1d0: 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d  xffffff, iRandom
f1e0: 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a  &0xff);.      /*
f1f0: 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69   The antipenulti
f200: 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f  mate character o
f210: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
f220: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20  rnal name must. 
f230: 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74       ** be "9" t
f240: 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c  o avoid name col
f250: 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69  lisions when usi
f260: 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  ng 8+3 filenames
f270: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
f280: 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74  t( zMaster[sqlit
f290: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74  e3Strlen30(zMast
f2a0: 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20  er)-3]=='9' );. 
f2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65       sqlite3File
f2c0: 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c  Suffix3(zMainFil
f2d0: 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  e, zMaster);.   
f2e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f2f0: 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
f300: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
f310: 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
f320: 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  s);.    }while( 
f330: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f340: 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20   res );.    if( 
f350: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f360: 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
f370: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f380: 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  l. */.      rc =
f390: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
f3a0: 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
f3b0: 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
f3c0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
f3d0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
f3e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
f3f0: 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E|.          SQL
f400: 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
f410: 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
f420: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
f430: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
f440: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f450: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
f460: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f470: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
f480: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f490: 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
f4a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
f4b0: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
f4c0: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
f4d0: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
f4e0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
f4f0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
f500: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
f510: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
f520: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
f530: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
f540: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
f550: 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
f560: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
f570: 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
f580: 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
f590: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
f5a0: 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
f5b0: 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
f5c0: 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
f5d0: 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
f5e0: 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
f5f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
f600: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
f610: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
f620: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
f630: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
f640: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
f650: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
f660: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
f670: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
f680: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
f690: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
f6a0: 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   zFile==0 ){.   
f6b0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
f6c0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
f6d0: 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
f6e0: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
f6f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
f700: 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30  ert( zFile[0]!=0
f710: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f720: 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
f730: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
f740: 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
f750: 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
f760: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
f770: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f780: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
f790: 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
f7a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
f7b0: 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
f7c0: 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
f7d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
f7e0: 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
f7f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f800: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f810: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
f820: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
f830: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f840: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
f850: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
f860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
f870: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
f880: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
f890: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
f8a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f8b0: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
f8c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f8d0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
f8e0: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
f8f0: 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
f900: 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
f910: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
f920: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
f930: 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30  dSync .     && 0
f940: 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
f950: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
f960: 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
f970: 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
f980: 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
f990: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
f9a0: 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
f9b0: 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
f9c0: 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
f9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
f9e0: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
f9f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa00: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
fa10: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
fa20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fa30: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
fa40: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fa50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
fa60: 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
fa70: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
fa80: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fa90: 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
faa0: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
fab0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
fac0: 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
fad0: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
fae0: 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
faf0: 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
fb00: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
fb10: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
fb20: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
fb30: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
fb40: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
fb50: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
fb60: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
fb70: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
fb80: 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
fb90: 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
fba0: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
fbb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
fbc0: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
fbd0: 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
fbe0: 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
fbf0: 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
fc00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fc10: 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
fc20: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
fc30: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
fc40: 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
fc50: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
fc60: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
fc70: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
fc80: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
fc90: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
fca0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
fcb0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
fcc0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
fcd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
fce0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
fcf0: 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
fd00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fd10: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
fd20: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
fd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
fd40: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
fd50: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
fd60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
fd70: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
fd80: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
fd90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fda0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
fdb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
fdc0: 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
fdd0: 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
fde0: 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
fdf0: 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
fe00: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
fe10: 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
fe20: 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
fe30: 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
fe40: 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
fe50: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
fe60: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fe70: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
fe80: 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
fe90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fea0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
feb0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
fec0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
fed0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fee0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
fef0: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
ff00: 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
ff10: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
ff20: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
ff30: 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
ff40: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
ff50: 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
ff60: 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
ff70: 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
ff80: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
ff90: 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
ffa0: 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
ffb0: 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
ffc0: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
ffd0: 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
ffe0: 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
fff0: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
10000 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
10010 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
10020 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
10030 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
10040 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
10050 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
10060 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
10070 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
10080 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
10090 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
100a0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
100b0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
100c0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
100d0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
100e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
100f0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
10100 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10110 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10120 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
10140 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
10150 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
10160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
10170 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
10180 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
10190 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
101a0 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
101b0 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
101c0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
101d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
101e0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
101f0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
10200 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
10210 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
10220 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
10230 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
10240 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
10250 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
10260 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
10270 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
10280 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
10290 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
102a0 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
102b0 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
102c0 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
102d0 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
102e0 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
102f0 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
10300 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
10310 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
10320 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
10330 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
10340 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
10350 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
10360 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
10370 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
10380 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
10390 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
103a0 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
103b0 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
103c0 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
103d0 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
103e0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
103f0 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
10400 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
10410 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
10420 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
10430 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49  .      if( p->bI
10440 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b  sReader ) nRead+
10450 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
10460 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
10470 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
10480 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b  ->nVdbeActive );
10490 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
104a0 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  e==db->nVdbeWrit
104b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
104c0 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52  Read==db->nVdbeR
104d0 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ead );.}.#else.#
104e0 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
104f0 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
10500 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
10510 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
10520 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
10530 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
10540 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
10550 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
10560 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
10570 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
10580 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10590 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
105a0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
105b0 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
105c0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
105d0 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
105e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
105f0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
10600 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
10610 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
10620 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
10630 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
10640 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
10650 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
10660 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
10670 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
10680 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
10690 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
106a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
106b0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
106c0 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
106d0 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
106e0 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
106f0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
10700 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10710 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
10720 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
10730 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
10740 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
10750 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
10760 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10770 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
10780 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
10790 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
107a0 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
107b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
107c0 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63  have occurred, c
107d0 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65  ausing an emerge
107e0 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  ncy rollback..  
107f0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
10800 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d  (db->nStatement=
10810 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69  =0), and there i
10820 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  s nothing to do.
10830 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10840 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
10850 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
10860 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
10870 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
10880 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
10890 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
108a0 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
108b0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
108c0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
108d0 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
108e0 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
108f0 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
10900 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
10910 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
10920 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
10930 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
10940 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
10950 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
10960 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
10970 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
10980 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
10990 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
109a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
109b0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
109c0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
109d0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
109e0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
109f0 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
10a00 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
10a10 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
10a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
10a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10a40 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
10a50 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
10a60 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
10a70 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
10a80 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
10a90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10ab0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10ac0 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
10ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10ae0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
10af0 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
10b00 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ment = 0;..    i
10b10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10b20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
10b30 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10b40 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
10b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
10b60 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
10b70 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10b80 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
10b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10bb0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10bc0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
10bd0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
10be0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
10bf0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
10c00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10c10 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
10c20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
10c30 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
10c40 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
10c50 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
10c60 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
10c70 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
10c80 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
10c90 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
10ca0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
10cb0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10cc0 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
10cd0 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
10ce0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10cf0 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
10d00 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
10d10 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
10d20 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
10d30 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
10d40 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
10d50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10d60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10d70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10d80 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
10d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
10da0 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
10db0 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
10dc0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10dd0 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
10de0 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
10df0 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
10e00 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
10e10 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
10e20 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
10e30 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
10e40 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
10e50 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
10e60 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
10e70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
10e80 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
10e90 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
10ea0 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
10eb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
10ec0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
10ed0 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
10ee0 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
10ef0 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
10f00 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
10f10 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
10f20 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
10f30 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
10f40 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
10f50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10f60 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
10f70 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10f80 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
10f90 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
10fa0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10fb0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
10fc0 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
10fd0 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
10fe0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
10ff0 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
11000 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
11010 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
11020 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
11030 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11040 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
11050 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
11060 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
11070 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
11080 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
11090 64 62 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  db, "FOREIGN KEY
110a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
110b0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
110c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
110d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
110e0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
110f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11100 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
11110 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
11120 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
11130 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
11140 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
11150 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
11160 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
11170 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
11180 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
11190 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
111a0 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
111b0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
111c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
111d0 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
111e0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
111f0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
11200 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
11210 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
11220 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
11230 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
11240 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
11250 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
11260 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
11270 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
11280 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
11290 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
112a0 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
112b0 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
112c0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
112d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
112e0 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
112f0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
11300 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
11310 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
11320 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
11330 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
11340 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
11350 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
11360 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
11390 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
113a0 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
113b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
113c0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
113d0 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
113e0 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
113f0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
11400 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
11410 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
11420 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
11430 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
11440 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
11450 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
11460 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
11470 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
11480 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
11490 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
114a0 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
114b0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
114c0 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
114d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
114e0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
114f0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
11500 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
11510 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
11520 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
11530 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
11540 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
11550 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
11560 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
11570 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
11580 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11590 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
115a0 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
115b0 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
115c0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
115d0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
115e0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
115f0 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
11600 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11610 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
11620 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
11630 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20   p->aOnceFlag ) 
11640 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46  memset(p->aOnceF
11650 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65  lag, 0, p->nOnce
11660 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c  Flag);.  closeAl
11670 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
11680 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
11690 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
116a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
116b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
116c0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
116d0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
116e0 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
116f0 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
11700 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
11710 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
11720 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
11730 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
11740 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
11750 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
11760 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
11770 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
11780 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
11790 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
117a0 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
117b0 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
117c0 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
117d0 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
117e0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
117f0 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
11800 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
11810 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
11820 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
11830 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
11840 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
11850 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
11860 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
11870 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
11880 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
11890 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
118a0 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74  0xff;.    assert
118b0 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
118c0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
118d0 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
118e0 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73  no longer exists
118f0 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61   */.    isSpecia
11900 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
11910 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
11920 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
11950 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
11960 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
11970 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
11980 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
11990 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
119a0 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
119b0 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
119c0 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
119d0 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
119e0 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
119f0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
11a00 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
11a10 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
11a20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
11a30 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
11a40 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
11a50 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
11a60 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
11a70 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
11a80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
11a90 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
11aa0 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
11ab0 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
11ac0 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
11ad0 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
11ae0 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
11af0 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
11b00 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
11b10 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
11b20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77  occurred while w
11b30 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
11b40 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e  urnal, sub-journ
11b50 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20  al or database. 
11b60 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
11b70 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72  part of an effor
11b80 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63  t to free up cac
11b90 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75  he space (see fu
11ba0 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
11bb0 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
11bc0 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72   pager.c), the r
11bd0 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69  ollback is requi
11be0 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a  red to restore .
11bf0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67        ** the pag
11c00 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65  er to a consiste
11c10 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
11c20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  */.      if( !p-
11c30 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63  >readOnly || mrc
11c40 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  !=SQLITE_INTERRU
11c50 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  PT ){.        if
11c60 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  ( (mrc==SQLITE_N
11c70 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
11c80 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e  ITE_FULL) && p->
11c90 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
11ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  ){.          eSt
11cb0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
11cc0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
11cd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
11cf0 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
11d00 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
11d10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
11d20 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
11d30 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
11d40 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
11d50 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
11d60 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
11d70 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
11d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
11d90 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
11da0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
11db0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
11dc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11dd0 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
11de0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
11df0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
11e00 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
11e10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11e20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
11e30 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
11e40 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
11e50 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
11e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11e80 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
11e90 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
11ea0 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
11eb0 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
11ec0 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
11ed0 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
11ee0 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
11ef0 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
11f00 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
11f10 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
11f20 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
11f30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
11f40 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
11f50 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
11f60 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
11f70 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
11f80 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
11f90 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
11fa0 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
11fb0 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
11fc0 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
11fd0 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
11fe0 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
11ff0 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  e==(p->readOnly=
12000 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
12010 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12020 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
12030 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
12040 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
12050 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
12060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
12070 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
12080 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
12090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
120a0 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
120b0 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
120c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
120d0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
120e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
120f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12100 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
12110 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
12120 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12130 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
12140 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
12150 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
12160 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
12170 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
12180 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
12190 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
121a0 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
121b0 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
121c0 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
121d0 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
121e0 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
121f0 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
12200 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
12210 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
12220 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
12230 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
12240 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
12250 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
12260 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
12270 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
12280 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
12290 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
122a0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
122b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
122c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
122d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
122e0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
122f0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
12300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12310 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
12320 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12330 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
12340 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
12350 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12360 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
12370 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
12380 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
12390 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
123a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
123b0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
123c0 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20  E_DeferFKs;.    
123d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
123e0 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
123f0 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
12400 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
12410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12420 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
12430 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
12440 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61  }.      db->nSta
12450 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
12460 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
12470 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  mentOp==0 ){.   
12480 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
12490 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
124a0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
124b0 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  il ){.        eS
124c0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
124d0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a  EPOINT_RELEASE;.
124e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
124f0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
12500 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
12510 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
12520 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
12530 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  LBACK;.      }el
12540 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
12550 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
12560 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
12570 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
12580 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
12590 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
125a0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
125b0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
125c0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
125d0 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
125e0 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
125f0 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
12600 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
12610 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
12620 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
12630 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
12640 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
12650 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
12660 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
12670 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
12680 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
12690 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
126a0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
126b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
126c0 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
126d0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
126e0 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a  hen promote the.
126f0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
12700 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63  tatement error c
12710 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
12720 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
12730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
12740 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
12750 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
12760 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
12770 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12780 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
12790 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72  LITE_OK || (p->r
127a0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
127b0 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
127c0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
127d0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
127e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
127f0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
12800 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
12810 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
12820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12830 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
12840 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
12850 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
12860 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
12870 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
12880 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
12890 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
128a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
128b0 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
128c0 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
128d0 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
128e0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
128f0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
12900 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
12910 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
12920 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12930 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
12940 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
12950 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
12960 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
12970 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
12980 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
12990 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
129a0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
129b0 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
129c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
129d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
129e0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
129f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12a00 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
12a10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
12a20 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
12a30 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
12a40 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  dbeLeave(p);.  }
12a50 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
12a60 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
12a70 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
12a80 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
12a90 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
12aa0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
12ab0 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76    db->nVdbeActiv
12ac0 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d  e--;.    if( !p-
12ad0 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e  >readOnly ) db->
12ae0 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20  nVdbeWrite--;.  
12af0 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
12b00 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65  er ) db->nVdbeRe
12b10 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ad--;.    assert
12b20 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
12b30 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  e>=db->nVdbeRead
12b40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12b50 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64  db->nVdbeRead>=d
12b60 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
12b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12b80 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29  >nVdbeWrite>=0 )
12b90 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
12ba0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
12bb0 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
12bc0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
12bd0 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
12be0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
12bf0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
12c00 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
12c10 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
12c20 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
12c30 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
12c40 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
12c50 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
12c60 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
12c70 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
12c80 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
12c90 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
12ca0 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
12cb0 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
12cc0 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
12cd0 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
12ce0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
12cf0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
12d00 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
12d10 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
12d20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
12d30 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62  beActive>0 || db
12d40 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
12d50 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  || db->nStatemen
12d60 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
12d70 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
12d80 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55  BUSY ? SQLITE_BU
12d90 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  SY : SQLITE_OK);
12da0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
12db0 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
12dc0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
12dd0 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
12de0 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
12df0 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
12e00 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
12e10 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
12e20 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
12e30 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
12e40 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
12e50 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
12e60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
12e70 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
12e80 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
12e90 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c  rror message bel
12ea0 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44  onging to the VD
12eb0 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  BE passed.** as 
12ec0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
12ed0 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61  nt to its databa
12ee0 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68  se handle (so th
12ef0 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
12f00 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20  .** returned by 
12f10 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
12f20 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73  _errcode() and s
12f30 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29  qlite3_errmsg())
12f40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
12f50 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
12f60 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72  lear the VDBE er
12f70 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73  ror code or mess
12f80 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70  age, just.** cop
12f90 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ies them to the 
12fa0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
12fb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12fc0 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
12fd0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
12fe0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
12ff0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  ;.  int rc = p->
13000 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72  rc;.  if( p->zEr
13010 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d  rMsg ){.    u8 m
13020 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62  allocFailed = db
13030 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
13040 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
13050 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
13060 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
13070 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
13080 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
13090 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
130a0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
130b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
130c0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
130d0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
130e0 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
130f0 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
13100 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
13110 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
13120 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
13130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13140 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
13150 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
13160 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49  /*.** If an SQLI
13170 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
13180 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65   hook is registe
13190 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68  red and the VM h
131a0 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a  as been run, .**
131b0 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73   invoke it..*/.s
131c0 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49  tatic void vdbeI
131d0 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65  nvokeSqllog(Vdbe
131e0 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *v){.  if( sqli
131f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13200 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63  xSqllog && v->rc
13210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76  ==SQLITE_OK && v
13220 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e  ->zSql && v->pc>
13230 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
13240 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69  zExpanded = sqli
13250 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c  te3VdbeExpandSql
13260 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20  (v, v->zSql);.  
13270 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d    assert( v->db-
13280 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b  >init.busy==0 );
13290 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64  .    if( zExpand
132a0 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
132b0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
132c0 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20  xSqllog(.       
132d0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
132e0 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
132f0 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  g, v->db, zExpan
13300 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a  ded, 1.      );.
13310 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
13320 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61  ree(v->db, zExpa
13330 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nded);.    }.  }
13340 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
13350 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  e vdbeInvokeSqll
13360 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  og(x).#endif../*
13370 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
13380 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
13390 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
133a0 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
133b0 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
133c0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
133d0 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
133e0 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
133f0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
13400 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
13410 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
13420 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
13430 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
13440 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
13450 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
13460 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
13470 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
13480 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
13490 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
134a0 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
134b0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
134c0 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
134d0 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
134e0 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
134f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
13500 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
13510 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
13520 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
13530 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
13540 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
13550 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
13560 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
13570 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
13580 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
13590 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
135a0 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
135b0 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
135c0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
135d0 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
135e0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
135f0 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
13600 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
13610 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
13620 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
13630 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
13640 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
13650 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
13660 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
13670 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
13680 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
13690 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
136a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
136b0 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
136c0 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
136d0 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
136e0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
136f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
13700 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
13710 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
13720 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
13730 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g(p);.    sqlite
13740 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
13750 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  or(p);.    sqlit
13760 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
13770 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
13780 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
13790 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
137a0 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
137b0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
137c0 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
137d0 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
137e0 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
137f0 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
13800 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
13810 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
13820 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
13830 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
13840 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
13850 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
13860 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
13870 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
13880 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
13890 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
138a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
138b0 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
138c0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
138d0 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
138e0 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
138f0 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
13900 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
13910 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
13920 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
13930 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
13940 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
13950 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
13960 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
13970 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
13980 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
13990 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
139a0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
139b0 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
139c0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
139d0 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
139e0 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
139f0 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
13a00 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
13a10 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
13a20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
13a30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
13a40 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
13a50 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
13a60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
13a70 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
13a80 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
13a90 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
13aa0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13ab0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  , "\n");.      f
13ac0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
13ad0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13ae0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36  fprintf(out, "%6
13af0 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22  d %10lld %8lld "
13b00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
13b10 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
13b20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
13b30 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
13b40 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
13b50 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
13b60 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
13b70 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
13b80 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
13b90 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
13ba0 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
13bb0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
13bc0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
13bd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13be0 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d    p->iCurrentTim
13bf0 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = 0;.  p->magi
13c00 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
13c10 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
13c20 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
13c30 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
13c40 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
13c50 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
13c60 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
13c70 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
13c80 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
13c90 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
13ca0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
13cb0 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
13cc0 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
13cd0 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
13ce0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
13cf0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13d00 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
13d10 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
13d20 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
13d30 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
13d40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13d50 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
13d60 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
13d70 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
13d80 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
13d90 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
13da0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
13dc0 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
13dd0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
13de0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
13df0 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
13e00 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
13e10 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
13e20 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
13e30 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
13e40 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
13e50 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
13e60 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
13e70 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
13e80 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
13e90 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
13ea0 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
13eb0 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
13ec0 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
13ed0 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
13ee0 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
13ef0 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
13f00 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
13f10 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
13f20 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
13f30 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
13f40 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
13f50 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
13f60 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
13f70 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
13f80 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
13f90 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
13fa0 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
13fb0 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
13fc0 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
13fd0 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
13fe0 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
13ff0 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
14000 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
14010 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
14020 63 6f 72 72 73 70 6f 6e 64 73 20 74 6f 20 62 69  corrsponds to bi
14030 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f  t 0 etc.)..*/.vo
14040 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
14050 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
14060 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70   *pVdbe, int iOp
14070 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41  , int mask){.  A
14080 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70  uxData **pp = &p
14090 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a  Vdbe->pAuxData;.
140a0 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
140b0 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
140c0 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
140d0 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
140e0 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70   (pAux->iOp==iOp
140f0 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e   && (pAux->iArg>
14100 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 28  31 || !(mask & (
14110 28 75 33 32 29 31 3c 3c 70 41 75 78 2d 3e 69 41  (u32)1<<pAux->iA
14120 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
14130 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
14140 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
14150 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
14160 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
14170 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
14180 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
14190 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
141a0 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78  (pVdbe->db, pAux
141b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
141c0 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
141d0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
141e0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
141f0 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
14200 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
14210 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
14220 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
14230 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
14240 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
14250 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
14260 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
14270 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
14280 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
14290 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
142a0 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
142b0 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
142c0 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
142d0 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
142e0 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
142f0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
14300 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14310 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
14320 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
14330 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
14340 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
14350 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
14360 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
14370 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
14380 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
14390 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
143a0 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
143b0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
143c0 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
143d0 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
143e0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
143f0 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
14400 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
14410 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
14420 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
14430 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
14440 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
14450 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
14460 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
14470 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
14480 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14490 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
144a0 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
144b0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
144c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
144d0 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
144e0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
144f0 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
14500 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
14510 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
14520 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  bel);.  sqlite3D
14530 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
14540 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
14550 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
14560 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
14570 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
14580 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ee);.#if defined
14590 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
145a0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73  REE_EXPLAIN).  s
145b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
145c0 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   p->zExplain);. 
145d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
145e0 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b  b, p->pExplain);
145f0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14600 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
14610 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
14620 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
14630 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
14640 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
14650 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
14660 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
14670 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
14680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14690 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
146a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
146b0 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
146c0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
146d0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
146e0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
146f0 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
14700 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
14710 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
14720 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
14730 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
14740 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
14750 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14760 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
14770 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
14780 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
14790 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
147a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
147b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
147c0 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
147d0 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
147e0 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
147f0 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
14800 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
14810 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
14820 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
14830 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
14840 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
14850 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
14860 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
14870 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
14880 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
14890 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
148a0 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
148b0 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
148c0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
148d0 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
148e0 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
148f0 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
14900 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
14910 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
14920 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
14930 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
14940 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
14950 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
14960 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
14970 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
14980 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
14990 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
149a0 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
149b0 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
149c0 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
149d0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
149e0 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
149f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14a00 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
14a10 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
14a20 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
14a30 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
14a40 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
14a50 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
14a60 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
14a70 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
14a80 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
14a90 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
14aa0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
14ab0 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
14ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14ad0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
14ae0 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
14af0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
14b00 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
14b10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14b20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52  rc;.    p->lastR
14b30 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f  owid = p->moveto
14b40 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20  Target;.    if( 
14b50 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
14b60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14b70 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  KPT;.    p->rowi
14b80 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69  dIsValid = 1;.#i
14b90 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
14ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
14bb0 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
14bc0 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72  dif.    p->defer
14bd0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
14be0 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
14bf0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
14c00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
14c10 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 69  pCursor ){.    i
14c20 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20  nt hasMoved;.   
14c30 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
14c40 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
14c50 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  oved(p->pCursor,
14c60 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20   &hasMoved);.   
14c70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14c80 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73   rc;.    if( has
14c90 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70  Moved ){.      p
14ca0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
14cb0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
14cc0 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20     p->nullRow = 
14cd0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
14ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
14d00 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
14d10 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
14d20 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
14d30 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
14d40 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
14d50 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
14d60 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
14d70 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
14d80 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
14d90 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
14da0 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
14db0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
14dc0 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
14dd0 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
14de0 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
14df0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
14e00 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
14e10 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
14e20 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
14e30 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
14e40 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
14e50 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
14e60 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
14e70 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
14e80 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
14e90 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
14ea0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
14eb0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
14ec0 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
14ed0 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
14ee0 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
14ef0 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
14f00 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
14f10 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
14f20 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
14f30 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
14f40 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
14f50 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
14f60 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
14f70 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
14f80 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
14f90 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
14fa0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
14fb0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
14fc0 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72   data blob separ
14fd0 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
14fe0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
14ff0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
15000 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
15010 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
15020 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
15030 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
15040 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
15050 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
15060 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
15070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
15080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
15090 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
150b0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
150c0 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
150e0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
150f0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
15100 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
15110 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
15120 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
15130 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
15160 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
15170 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
15180 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
15190 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
151a0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151c0 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
151d0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
151e0 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
15200 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
15210 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
15220 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
15230 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
15240 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
15250 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
15270 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
15280 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
15290 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
152b0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
152c0 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
152d0 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
15300 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
15310 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
15320 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
15330 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
15340 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
15350 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
15360 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
15370 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
15380 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
15390 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
153a0 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
153b0 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
153c0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
153d0 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
153e0 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
153f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
15400 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
15410 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
15420 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
15430 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
15440 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
15450 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
15460 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
15470 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
15480 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
15490 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
154a0 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
154b0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
154c0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
154d0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
154e0 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
154f0 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
15500 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
15510 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
15520 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
15530 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
15540 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
15550 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
15560 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
15570 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42    if( i<(-MAX_6B
15580 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b  YTE) ) return 6;
15590 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f  .      /* Previo
155a0 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73  us test prevents
155b0 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37  :  u = -(-922337
155c0 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a  2036854775808) *
155d0 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a  /.      u = -i;.
155e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155f0 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
15600 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a    if( u<=127 ){.
15610 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69        return ((i
15620 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
15630 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75  ormat>=4) ? 8+(u
15640 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a  32)u : 1;.    }.
15650 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
15660 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
15670 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
15680 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
15690 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
156a0 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
156b0 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
156c0 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
156d0 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
156e0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
156f0 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
15700 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
15710 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
15720 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
15730 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
15740 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
15750 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
15760 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
15770 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
15780 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
15790 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
157a0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
157b0 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
157c0 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
157d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
157e0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
157f0 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
15800 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
15810 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
15820 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
15830 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
15840 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
15850 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
15860 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
15870 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
15880 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
15890 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
158a0 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
158b0 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
158c0 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
158d0 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
158e0 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
158f0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
15900 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
15910 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
15920 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
15930 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
15940 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
15950 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
15960 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
15970 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
15980 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
15990 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
159a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
159b0 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
159c0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
159d0 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
159e0 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
159f0 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
15a00 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
15a10 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
15a20 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
15a30 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
15a40 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
15a50 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
15a60 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
15a70 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
15a80 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
15a90 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
15aa0 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
15ab0 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
15ac0 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
15ad0 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
15ae0 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
15af0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
15b00 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
15b10 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
15b20 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
15b30 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
15b40 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
15b50 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
15b60 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
15b70 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
15b80 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
15b90 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
15ba0 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
15bb0 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
15bc0 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
15bd0 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
15be0 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
15bf0 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
15c00 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
15c10 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
15c20 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
15c30 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
15c40 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
15c50 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
15c60 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
15c70 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
15c80 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
15c90 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
15ca0 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
15cb0 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
15cc0 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
15cd0 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
15ce0 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
15cf0 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
15d00 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
15d10 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
15d20 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
15d30 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
15d40 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
15d50 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
15d60 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
15d70 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
15d80 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
15d90 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
15da0 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
15db0 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
15dc0 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
15dd0 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
15de0 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
15df0 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
15e00 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
15e10 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
15e20 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
15e30 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
15e40 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
15e50 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
15e60 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
15e70 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
15e80 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
15e90 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
15ea0 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
15eb0 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
15ec0 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
15ed0 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
15ee0 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
15ef0 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
15f00 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
15f10 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
15f20 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
15f30 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
15f40 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
15f50 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
15f60 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
15f70 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
15f80 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
15f90 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
15fa0 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
15fb0 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
15fc0 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
15fd0 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
15fe0 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
15ff0 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
16000 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
16010 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
16020 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
16030 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
16040 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
16050 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
16060 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
16070 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
16080 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
16090 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
160a0 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
160b0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
160c0 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
160d0 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
160e0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
160f0 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
16100 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
16110 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
16120 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
16130 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
16140 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
16150 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
16160 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
16170 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
16180 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
16190 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75   buf[].  nBuf mu
161a0 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20  st always be.** 
161b0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
161c0 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
161d0 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20  field.  Except, 
161e0 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a  if the field is.
161f0 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61  ** a blob with a
16200 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
16210 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69  l, then buf[] mi
16220 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20  ght be just the 
16230 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f  right.** size to
16240 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67   hold everything
16250 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
16260 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
16270 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69  .  If buf[].** i
16280 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67  s only big enoug
16290 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f  h to hold the no
162a0 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74  n-zero prefix, t
162b0 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  hen only write t
162c0 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  hat.** prefix in
162d0 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69  to buf[].  But i
162e0 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65  f buf[] is large
162f0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
16300 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66  both the.** pref
16310 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20  ix and the tail 
16320 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
16330 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68  refix and set th
16340 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a  e tail to all.**
16350 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65   zeros..**.** Re
16360 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16370 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
16380 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
16390 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
163a0 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
163b0 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
163c0 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
163d0 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
163e0 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
163f0 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
16400 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
16410 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
16420 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
16430 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75  u8 *buf, int nBu
16440 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  f, Mem *pMem, in
16450 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
16460 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16470 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  e = sqlite3VdbeS
16480 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20  erialType(pMem, 
16490 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
164a0 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
164b0 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
164c0 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
164d0 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
164e0 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
164f0 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
16500 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
16510 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
16520 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16530 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
16540 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  ->r) );.      me
16550 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e  mcpy(&v, &pMem->
16560 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
16570 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
16580 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
16590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
165a0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
165b0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
165c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
165d0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
165e0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
165f0 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e  ert( len<=(u32)n
16600 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
16610 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
16620 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30  uf[i] = (u8)(v&0
16630 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
16640 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
16650 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
16660 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
16670 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
16680 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
16690 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
166a0 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
166b0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
166c0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
166d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
166e0 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
166f0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
16700 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
16710 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
16720 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  >n<=nBuf );.    
16730 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
16740 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
16750 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
16760 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
16770 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
16780 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65        len += pMe
16790 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  m->u.nZero;.    
167a0 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d    assert( nBuf>=
167b0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  0 );.      if( l
167c0 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29  en > (u32)nBuf )
167d0 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20  {.        len = 
167e0 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20  (u32)nBuf;.     
167f0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
16800 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
16810 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
16820 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
16830 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
16840 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
16850 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
16860 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
16870 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
16880 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
16890 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
168a0 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
168b0 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
168c0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
168d0 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
168e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
168f0 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75  ytes read..*/ .u
16900 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
16910 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
16920 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16930 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
16940 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
16950 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
16960 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
16970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
16980 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
16990 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
169a0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
169b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
169c0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
169d0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
169e0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
169f0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
16a00 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
16a10 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
16a20 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
16a30 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
16a40 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
16a50 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
16a60 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
16a70 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
16a80 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
16a90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16aa0 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
16ab0 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
16ac0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
16ad0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
16ae0 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
16af0 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
16b00 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
16b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
16b20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
16b30 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
16b40 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
16b50 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
16b60 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
16b70 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
16b80 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
16b90 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16ba0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
16bb0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
16bc0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
16bd0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
16be0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
16bf0 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
16c00 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
16c10 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
16c20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
16c30 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
16c40 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
16c50 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
16c60 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
16c70 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
16c80 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
16c90 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
16ca0 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
16cb0 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
16cc0 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
16cd0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
16ce0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
16cf0 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
16d00 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
16d10 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
16d20 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
16d30 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
16d40 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
16d50 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
16d60 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
16d70 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
16d80 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
16d90 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
16da0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
16db0 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
16dc0 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
16dd0 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
16de0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
16df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
16e00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
16e10 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
16e20 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
16e30 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
16e40 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
16e50 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
16e60 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
16e70 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
16e80 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
16e90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
16ea0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
16eb0 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
16ec0 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
16ed0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
16ee0 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
16ef0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
16f00 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
16f10 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
16f20 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
16f30 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
16f40 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
16f50 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
16f60 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
16f70 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
16f80 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
16f90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
16fa0 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
16fb0 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
16fc0 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
16fd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
16fe0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
16ff0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
17000 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
17010 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
17020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
17030 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
17040 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
17050 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
17060 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
17070 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
17080 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
17090 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
170a0 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
170b0 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
170c0 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
170d0 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
170e0 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
170f0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
17100 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
17110 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
17120 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
17130 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
17140 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
17150 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
17160 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
17180 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
17190 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
171a0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
171b0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
171c0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
171d0 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
171e0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
171f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17200 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
17210 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
17220 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
17230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
17240 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
17250 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
17260 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
17270 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
17280 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
17290 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
172a0 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
172b0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
172c0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
172d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
172e0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
172f0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
17300 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
17310 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
17320 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
17330 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
17340 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72    u32 len = (ser
17350 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
17360 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
17370 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
17380 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
17390 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
173a0 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d  el = 0;.      pM
173b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
173c0 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
173d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  ;.      return l
173e0 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
173f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
17400 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17410 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
17420 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
17430 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
17440 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
17450 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
17460 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
17470 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
17480 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
17490 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
174a0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
174b0 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
174c0 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
174d0 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
174e0 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
174f0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
17500 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
17510 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
17520 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
17530 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
17540 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
17550 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
17560 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
17570 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
17580 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
17590 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
175a0 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
175b0 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
175c0 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
175d0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
175e0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
175f0 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
17600 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
17610 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
17620 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
17630 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
17640 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
17650 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
17660 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
17670 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
17680 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
17690 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
176a0 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
176b0 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
176c0 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
176d0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
176e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
176f0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
17700 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
17710 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
17720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
17730 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
17740 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  vailable */.  in
17750 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20  t szSpace,      
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17770 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
17780 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
17790 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20  char **ppFree   
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73  /* OUT: Caller s
177c0 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20  hould free this 
177d0 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  pointer */.){.  
177e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
177f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
17800 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
17810 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
17820 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20    int nOff;     
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70    /* Increment p
17850 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f  Space by nOff to
17860 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69   align it */.  i
17870 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
17880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17890 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
178a0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a  s required for *
178b0 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61  p */..  /* We wa
178c0 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20  nt to shift the 
178d0 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75  pointer pSpace u
178e0 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  p such that it i
178f0 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 8-byte aligned
17900 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20  ..  ** Thus, we 
17910 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  need to calculat
17920 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c  e a value, nOff,
17930 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37   between 0 and 7
17940 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a  , to shift .  **
17950 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61   it by.  If pSpa
17960 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d  ce is already 8-
17970 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f  byte aligned, nO
17980 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  ff should be zer
17990 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d  o..  */.  nOff =
179a0 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54   (8 - (SQLITE_PT
179b0 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29  R_TO_INT(pSpace)
179c0 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42   & 7)) & 7;.  nB
179d0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
179e0 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
179f0 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
17a00 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
17a10 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
17a20 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66  Byte>szSpace+nOf
17a30 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  f ){.    p = (Un
17a40 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
17a50 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
17a60 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
17a70 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46  nByte);.    *ppF
17a80 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b  ree = (char *)p;
17a90 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65  .    if( !p ) re
17aa0 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
17ab0 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
17ac0 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63  edRecord*)&pSpac
17ad0 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70  e[nOff];.    *pp
17ae0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Free = 0;.  }.. 
17af0 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
17b00 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
17b10 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
17b20 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
17b30 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
17b40 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
17b50 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
17b60 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
17b70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
17b80 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b  nfo->nField + 1;
17b90 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
17ba0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
17bb0 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
17bc0 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
17bd0 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61  n pKey[], popula
17be0 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63  te the .** Unpac
17bf0 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
17c00 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
17c10 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
17c20 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a  ment with the.**
17c30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
17c40 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e   decoded record.
17c50 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
17c60 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
17c70 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
17c80 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
17c90 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
17ca0 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
17cb0 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
17cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17cd0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
17ce0 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
17cf0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
17d00 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
17d10 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
17d20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
17d30 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75   *p      /* Popu
17d40 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74  late this struct
17d50 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ure before retur
17d60 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ning. */.){.  co
17d70 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17d80 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
17d90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17da0 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20  )pKey;.  int d; 
17db0 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20  .  u32 idx;     
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dd0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
17de0 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66  aKey[] to read f
17df0 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20  rom */.  u16 u; 
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
17e20 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
17e30 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
17e40 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
17e50 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66  p->aMem;..  p->f
17e60 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65  lags = 0;.  asse
17e70 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
17e80 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
17e90 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
17ea0 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
17eb0 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
17ec0 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
17ed0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
17ee0 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  u<p->nField && d
17ef0 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33  <=nKey ){.    u3
17f00 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
17f10 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
17f20 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78  rint32(&aKey[idx
17f30 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
17f40 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
17f50 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
17f60 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
17f70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
17f80 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20   /* pMem->flags 
17f90 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56  = 0; // sqlite3V
17fa0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77  dbeSerialGet() w
17fb0 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72  ill set this for
17fc0 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   us */.    pMem-
17fd0 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
17fe0 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
17ff0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
18000 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
18010 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
18020 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20  em++;.    u++;. 
18030 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
18040 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
18050 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
18060 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a  eld = u;.}../*.*
18070 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18080 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
18090 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
180a0 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
180b0 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
180c0 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
180d0 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
180e0 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
180f0 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
18100 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
18110 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
18120 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
18130 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
18140 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
18150 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
18160 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
18170 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
18180 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
18190 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
181a0 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
181b0 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
181c0 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
181d0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
181e0 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
181f0 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65  Record..**.** Ke
18200 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
18210 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
18220 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
18230 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a  er of fields..**
18240 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65   The key with fe
18250 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73  wer fields is us
18260 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c  ually compares l
18270 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a  ess than the .**
18280 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f   longer key.  Ho
18290 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50  wever if the UNP
182a0 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c  ACKED_INCRKEY fl
182b0 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73  ags in pPKey2 is
182c0 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20   set.** and the 
182d0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20  common prefixes 
182e0 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
182f0 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
18300 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66  n key2..** Or if
18310 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41   the UNPACKED_MA
18320 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20  TCH_PREFIX flag 
18330 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70  is set and the p
18340 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65  refixes are.** e
18350 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b  qual, then the k
18360 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  eys are consider
18370 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61  ed to be equal a
18380 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20  nd.** the parts 
18390 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  beyond the commo
183a0 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e  n prefix are ign
183b0 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
183c0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
183d0 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
183e0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
183f0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
18400 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
18410 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
18420 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
18430 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ey */.){.  u32 d
18440 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
18450 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
18460 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
18470 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
18480 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
18490 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
184a0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
184b0 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
184c0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
184d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
184e0 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
184f0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
18500 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
18510 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
18520 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
18530 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
18540 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
18550 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
18560 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
18570 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
18580 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
18590 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
185a0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
185b0 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
185c0 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
185d0 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
185e0 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
185f0 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
18600 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
18610 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
18620 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
18630 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
18640 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
18650 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
18660 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
18670 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
18680 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
18690 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
186a0 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
186b0 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
186c0 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
186d0 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
186e0 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
186f0 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
18700 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
18710 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
18720 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
18730 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
18740 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
18750 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
18760 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
18770 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
18780 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
18790 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
187a0 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
187b0 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
187c0 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
187d0 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
187e0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
187f0 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
18800 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
18810 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
18820 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
18830 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
18840 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
18850 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
18860 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
18870 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
18880 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
18890 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
188a0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
188b0 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
188c0 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
188d0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43  ey2->nField || C
188e0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
188f0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
18900 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
18910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
18920 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
18930 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
18940 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
18950 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
18960 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
18970 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
18980 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
18990 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
189a0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
189b0 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
189c0 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
189d0 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
189e0 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
189f0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
18a00 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
18a10 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
18a20 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
18a30 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
18a40 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
18a50 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
18a60 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
18a70 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
18a80 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
18a90 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
18aa0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
18ab0 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
18ac0 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
18ad0 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
18ae0 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
18af0 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
18b00 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
18b10 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
18b20 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
18b30 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
18b40 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
18b50 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
18b60 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
18b70 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18b80 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
18b90 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
18ba0 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
18bb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
18bc0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
18bd0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
18be0 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
18bf0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
18c00 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
18c10 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
18c20 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
18c30 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
18c40 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
18c50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18c60 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
18c70 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
18c80 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
18c90 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
18ca0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
18cb0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
18cc0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
18cd0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
18ce0 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
18cf0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
18d00 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
18d10 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
18d20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
18d30 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
18d40 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
18d50 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
18d60 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  c;.    }.    i++
18d70 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
18d80 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
18d90 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
18da0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
18db0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
18dc0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
18dd0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
18de0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
18df0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
18e00 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
18e10 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
18e20 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
18e30 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
18e40 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
18e50 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
18e60 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
18e70 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c  ssert( mem1.zMal
18e80 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
18e90 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
18ea0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
18eb0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
18ec0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
18ed0 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
18ee0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
18ef0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20   were equal. If 
18f00 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  the UNPACKED_INC
18f10 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69  RKEY.  ** flag i
18f20 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61  s set, then brea
18f30 6b 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65  k the tie by tre
18f40 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61  ating key2 as la
18f50 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rger..  ** If th
18f60 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58  e UPACKED_PREFIX
18f70 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73  _MATCH flag is s
18f80 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69  et, then keys wi
18f90 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  th common prefix
18fa0 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73  es.  ** are cons
18fb0 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
18fc0 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
18fd0 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69  the longer key i
18fe0 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67  s the .  ** larg
18ff0 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65  er.  As it happe
19000 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77  ns, the pPKey2 w
19010 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68  ill always be th
19020 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66  e longer.  ** if
19030 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66   there is a diff
19040 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61  erence..  */.  a
19050 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
19060 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
19070 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
19080 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63  NCRKEY ){.    rc
19090 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69   = -1;.  }else i
190a0 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
190b0 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
190c0 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20  IX_MATCH ){.    
190d0 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a  /* Leave rc==0 *
190e0 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64  /.  }else if( id
190f0 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20  x1<szHdr1 ){.   
19100 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72   rc = 1;.  }.  r
19110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f  eturn rc;.}. ../
19120 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
19130 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
19140 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
19150 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
19160 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
19170 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
19180 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
19190 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
191a0 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
191b0 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
191c0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
191d0 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
191e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
191f0 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
19200 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
19210 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
19220 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
19230 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
19240 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
19250 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
19260 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
19270 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
19280 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
19290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
192a0 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
192b0 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
192c0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
192d0 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
192e0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
192f0 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
19300 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
19310 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
19320 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
19330 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
19340 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
19350 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
19360 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
19370 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
19380 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55    Mem m, v;..  U
19390 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
193a0 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  db);..  /* Get t
193b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
193c0 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
193d0 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
193e0 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
193f0 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
19400 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
19410 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
19420 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
19430 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
19440 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
19450 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
19460 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
19470 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
19480 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
19490 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
194a0 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
194b0 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
194c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
194d0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
194e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
194f0 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
19500 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
19510 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
19520 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
19530 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
19540 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
19550 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
19560 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
19570 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
19580 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
19590 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
195a0 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
195b0 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
195c0 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
195d0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
195e0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   */.  memset(&m,
195f0 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
19600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
19610 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
19620 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
19630 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
19640 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
19650 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
19660 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
19670 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
19680 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
19690 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
196a0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
196b0 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
196c0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
196d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
196e0 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
196f0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
19700 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
19710 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
19720 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
19730 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
19740 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
19750 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
19760 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
19770 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
19780 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
19790 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
197a0 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
197b0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
197c0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
197d0 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
197e0 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
197f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
19800 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
19810 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
19820 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
19830 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
19840 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
19850 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
19860 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
19870 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
19880 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
19890 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
198a0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
198b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
198c0 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
198d0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
198e0 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
198f0 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
19900 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
19910 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
19920 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
19930 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
19940 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
19950 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
19960 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
19970 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
19980 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
19990 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
199a0 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
199b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
199c0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
199d0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
199e0 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
199f0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
19a00 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
19a10 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
19a20 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
19a30 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
19a40 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
19a50 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
19a60 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
19a70 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
19a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19a90 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
19aa0 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
19ab0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
19ac0 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
19ad0 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
19ae0 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
19af0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
19b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19b10 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
19b20 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
19b30 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
19b40 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
19b50 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
19b60 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
19b70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19b80 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
19b90 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
19ba0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
19bb0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
19bc0 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
19bd0 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
19be0 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
19bf0 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
19c00 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
19c10 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
19c20 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
19c30 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
19c40 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
19c50 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
19c60 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
19c70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
19c80 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
19c90 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
19ca0 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
19cb0 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
19cc0 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
19cd0 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
19ce0 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
19cf0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
19d00 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
19d10 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
19d20 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
19d30 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
19d40 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
19d50 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
19d60 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
19d70 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
19d80 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
19d90 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
19da0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
19db0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
19dc0 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
19dd0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
19de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19df0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
19e00 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
19e10 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
19e20 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
19e30 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
19e40 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f  ion of key to co
19e50 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
19e60 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e80 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
19e90 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
19ea0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
19eb0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
19ec0 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
19ed0 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
19ee0 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
19ef0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19f00 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
19f10 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
19f20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
19f30 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
19f40 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
19f50 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
19f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
19f70 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
19f80 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
19f90 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
19fa0 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
19fb0 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
19fc0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
19fd0 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
19fe0 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20  se of the say.  
19ff0 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
1a000 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
1a010 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
1a020 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
1a030 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
1a040 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
1a050 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
1a060 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
1a070 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a080 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1a090 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
1a0a0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
1a0b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a0c0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
1a0d0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
1a0e0 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
1a0f0 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
1a100 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1a110 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1a120 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67   pUnpacked->flag
1a130 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
1a140 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20 2a  FIX_MATCH );.  *
1a150 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
1a160 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
1a170 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
1a180 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
1a190 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
1a1a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a1b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1a1c0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1a1d0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
1a1e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
1a1f0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1a200 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
1a210 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
1a220 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
1a230 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
1a240 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
1a250 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
1a260 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
1a270 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a280 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
1a290 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
1a2a0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
1a2b0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
1a2c0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
1a2d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
1a2e0 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
1a2f0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
1a300 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
1a310 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
1a320 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
1a330 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1a340 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
1a350 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
1a360 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
1a370 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
1a380 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
1a390 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
1a3a0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
1a3b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
1a3c0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
1a3d0 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
1a3e0 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
1a3f0 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
1a400 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
1a410 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
1a420 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
1a430 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
1a440 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
1a450 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
1a460 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
1a470 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
1a480 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
1a490 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1a4a0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
1a4b0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
1a4c0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
1a4d0 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
1a4e0 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
1a4f0 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
1a500 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
1a510 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a520 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
1a530 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
1a540 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
1a550 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
1a560 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
1a570 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
1a580 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
1a590 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a5a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1a5b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a5c0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
1a5d0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
1a5e0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
1a5f0 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
1a600 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1a610 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
1a620 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
1a630 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
1a640 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
1a650 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
1a660 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
1a670 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1a680 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
1a690 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
1a6a0 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
1a6b0 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
1a6c0 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
1a6d0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
1a6e0 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
1a6f0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
1a700 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
1a710 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
1a720 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
1a730 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1a740 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
1a750 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
1a760 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
1a770 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
1a780 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62  etBoundValue(Vdb
1a790 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20  e *v, int iVar, 
1a7a0 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72  u8 aff){.  asser
1a7b0 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
1a7c0 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20  f( v ){.    Mem 
1a7d0 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72  *pMem = &v->aVar
1a7e0 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66  [iVar-1];.    if
1a7f0 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67  ( 0==(pMem->flag
1a800 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b  s & MEM_Null) ){
1a810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
1a820 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c  alue *pRet = sql
1a830 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e  ite3ValueNew(v->
1a840 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
1a850 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Ret ){.        s
1a860 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
1a870 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70  y((Mem *)pRet, p
1a880 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
1a890 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
1a8a0 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66  ffinity(pRet, af
1a8b0 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  f, SQLITE_UTF8);
1a8c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a8d0 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65  VdbeMemStoreType
1a8e0 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20  ((Mem *)pRet);. 
1a8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1a900 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
1a910 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a920 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
1a930 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
1a940 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
1a950 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
1a960 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
1a970 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
1a980 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
1a990 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
1a9a0 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
1a9b0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
1a9c0 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
1a9d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1a9e0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
1a9f0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
1aa00 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
1aa10 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  >0 );.  if( iVar
1aa20 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  >32 ){.    v->ex
1aa30 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66  pmask = 0xffffff
1aa40 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
1aa50 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
1aa60 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
1aa70 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  1));.  }.}..#ifn
1aa80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aa90 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
1aaa0 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f  ** Transfer erro
1aab0 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66  r message text f
1aac0 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  rom an sqlite3_v
1aad0 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  tab.zErrMsg (tex
1aae0 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
1aaf0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1ab00 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1ab10 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e  oc) into a Vdbe.
1ab20 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
1ab30 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
1ab40 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1ab50 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29  sqlite3DbMalloc)
1ab60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ab70 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
1ab80 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74  g(Vdbe *p, sqlit
1ab90 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
1aba0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1abb0 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65   p->db;.  sqlite
1abc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
1abd0 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
1abe0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
1abf0 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
1ac00 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b->zErrMsg);.  s
1ac10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
1ac20 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
1ac30 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
1ac40 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1ac50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1ac60 41 4c 54 41 42 4c 45 20 2a 2f 0a                 ALTABLE */.