/ Hex Artifact Content
Login

Artifact c01594ecf5a78ef41a721f3465152bb91883a942:


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 23 69 66 64 65 66 20 53  eV2;.}..#ifdef S
0800: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0810: 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67 20 6f  * Turn tracing o
0820: 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64  n or off.*/.void
0830: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
0840: 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c 45 20  e(Vdbe *p, FILE 
0850: 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72  *trace){.  p->tr
0860: 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 23  ace = trace;.}.#
0870: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  endif../*.** Res
0880: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70  ize the Vdbe.aOp
0890: 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 69   array so that i
08a0: 74 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  t is at least on
08b0: 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68 61 6e  e op larger than
08c0: 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a 2a 0a   .** it was..**.
08d0: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
08e0: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
08f0: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
0900: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
0910: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
0920: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
0930: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
0940: 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65  Vdbe.nOpAlloc re
0950: 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  main .** unchang
0960: 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74  ed (this is so t
0970: 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73 20  hat any opcodes 
0980: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0990: 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72  d can be .** cor
09a0: 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74  rectly deallocat
09b0: 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
09c0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56 64  e rest of the Vd
09d0: 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  be)..*/.static i
09e0: 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28 56  nt growOpArray(V
09f0: 64 62 65 20 2a 70 29 7b 0a 20 20 56 64 62 65 4f  dbe *p){.  VdbeO
0a00: 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  p *pNew;.  int n
0a10: 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c  New = (p->nOpAll
0a20: 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  oc ? p->nOpAlloc
0a30: 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f  *2 : (int)(1024/
0a40: 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20  sizeof(Op)));.  
0a50: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
0a60: 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70  Realloc(p->db, p
0a70: 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a 65  ->aOp, nNew*size
0a80: 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20 70  of(Op));.  if( p
0a90: 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f  New ){.    p->nO
0aa0: 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  pAlloc = sqlite3
0ab0: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
0ac0: 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a 65 6f 66  db, pNew)/sizeof
0ad0: 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  (Op);.    p->aOp
0ae0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
0af0: 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 53 51  eturn (pNew ? SQ
0b00: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
0b10: 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _NOMEM);.}../*.*
0b20: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0b30: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0b40: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0b50: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0b60: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0b70: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0b80: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0b90: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0ba0: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
0bb0: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
0bc0: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
0bd0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
0be0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
0bf0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
0c00: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0c10: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
0c20: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
0c30: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
0c40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
0c50: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
0c60: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
0c70: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
0c80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
0c90: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
0ca0: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
0cb0: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
0cc0: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  operand..*/.int 
0cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0ce0: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
0cf0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0d00: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e  2, int p3){.  in
0d10: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
0d20: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
0d30: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
0d40: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
0d50: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
0d60: 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30  rt( op>0 && op<0
0d70: 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  xff );.  if( p->
0d80: 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20  nOpAlloc<=i ){. 
0d90: 20 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72     if( growOpArr
0da0: 61 79 28 70 29 20 29 7b 0a 20 20 20 20 20 20 72  ay(p) ){.      r
0db0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
0dc0: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20   }.  p->nOp++;. 
0dd0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
0de0: 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ];.  pOp->opcode
0df0: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70   = (u8)op;.  pOp
0e00: 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  ->p5 = 0;.  pOp-
0e10: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
0e20: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
0e30: 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d  >p3 = p3;.  pOp-
0e40: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.p = 0;.  pOp
0e50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
0e60: 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51  TUSED;.#ifdef SQ
0e70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 4f 70  LITE_DEBUG.  pOp
0e80: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
0e90: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
0ea0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
0eb0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
0ec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
0ed0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
0ee0: 4f 70 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64  Op[i]);.  }.#end
0ef0: 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  if.#ifdef VDBE_P
0f00: 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79  ROFILE.  pOp->cy
0f10: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  cles = 0;.  pOp-
0f20: 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  >cnt = 0;.#endif
0f30: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
0f40: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0f50: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
0f60: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
0f70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0f80: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
0f90: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
0fa0: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
0fb0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0fc0: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
0fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
0fe0: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
0ff0: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1000: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
1010: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1020: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
1030: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1040: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
1050: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  , p2, 0);.}.../*
1060: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1070: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1080: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1090: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
10a0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
10b0: 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Op4(.  Vdbe *p, 
10c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10d0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
10e0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
10f0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1100: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
1110: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
1120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1130: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1140: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1150: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1160: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1170: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1180: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1190: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  and */.  const c
11a0: 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20  har *zP4,    /* 
11b0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
11c0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
11d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
11e0: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
11f0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
1200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1210: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
1220: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
1230: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
1240: 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b  r, zP4, p4type);
1250: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1260: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1270: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f  OP_ParseSchema o
1280: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
1290: 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f  tine is broken o
12a0: 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ut from.** sqlit
12b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73  e3VdbeAddOp4() s
12c0: 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f  ince it needs to
12d0: 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d   also needs to m
12e0: 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a  ark all btrees.*
12f0: 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e  * as having been
1300: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
1310: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
1320: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1330: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1340: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
1350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1360: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
1370: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
1380: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
1390: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
13a0: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
13b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
13c0: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
13d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61    int j;.  int a
13e0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
13f0: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61  eAddOp3(p, OP_Pa
1400: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
1410: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
1420: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1430: 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34  addr, zWhere, P4
1440: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
1450: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
1460: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
1470: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
1480: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
1490: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
14a0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
14b0: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
14c0: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
14d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
14e0: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1500: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1510: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1520: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1530: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1540: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1560: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1570: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1580: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1590: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
15a0: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
15b0: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
15c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
15d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15e0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
15f0: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
1600: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
1610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1620: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
1630: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
1640: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
1650: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1660: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
1670: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
1680: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dr;.}../*.** Cre
1690: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
16a0: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
16b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
16c0: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
16d0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
16e0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
16f0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
1700: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
1710: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
1720: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
1730: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
1740: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
1750: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
1760: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
1770: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
1780: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
1790: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
17a0: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
17b0: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
17c0: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
17d0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
17e0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
17f0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
1800: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
1810: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
1820: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
1830: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
1840: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
1850: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
1860: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
1870: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
1880: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
1890: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
18a0: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
18b0: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
18c0: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
18d0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
18e0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
18f0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
1900: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1910: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
1920: 70 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d  p){.  int i = p-
1930: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73  >nLabel++;.  ass
1940: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1950: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1960: 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d  ;.  if( (i & (i-
1970: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  1))==0 ){.    p-
1980: 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  >aLabel = sqlite
1990: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
19a0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
19b0: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b             (i*2+
19e0: 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61  1)*sizeof(p->aLa
19f0: 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  bel[0]));.  }.  
1a00: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1a10: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1a20: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1a30: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1a40: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1a50: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1a60: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1a70: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1a80: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
1a90: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
1aa0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
1ab0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
1ac0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
1ad0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1ae0: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1af0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1b00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1b10: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1b20: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1b30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1b40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1b50: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1b60: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1b70: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1b80: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1b90: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1ba0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1bb0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1bc0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1bd0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1be0: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1bf0: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1c00: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1c10: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1c20: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1c30: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1c40: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1c50: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1c60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1c70: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1c80: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1c90: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1ca0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1cb0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1cc0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1cd0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1ce0: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1cf0: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1d00: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1d10: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1d20: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1d30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1d40: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1d50: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1d60: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1d70: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1d80: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1d90: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1dc0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1dd0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1de0: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1df0: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1e00: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1e10: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1e20: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1e30: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1e40: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1e50: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1e60: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1e70: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1e80: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1e90: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1ea0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1eb0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1ec0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1ed0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1ee0: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1ef0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1f00: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1f10: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f30: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1f40: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1f50: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1f60: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1f70: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1f80: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1f90: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1fc0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1fd0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1fe0: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1ff0: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
2000: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
2010: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
2020: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
2030: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
2040: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
2050: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
2060: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
2070: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
2080: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
2090: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
20a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
20b0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
20c0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
20d0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
20e0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
20f0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2100: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2110: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2120: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2130: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2140: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2150: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2160: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2170: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
2180: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
2190: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
21a0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
21b0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
21c0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
21d0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
21e0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
21f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2200: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2210: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2220: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2230: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2240: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2250: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2260: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2270: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
2280: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
2290: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
22a0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
22b0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
22c0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
22d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
22e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
22f0: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2300: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2310: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2320: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2330: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2350: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2360: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2370: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2380: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
2390: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
23a0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
23b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
23c0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
23d0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
23e0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
23f0: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2400: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2410: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2420: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2430: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2440: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2450: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2460: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2470: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2480: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2490: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
24a0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
24b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
24c0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
24d0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
24e0: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
24f0: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2500: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2510: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2520: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2530: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2540: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2550: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2560: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2570: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
2580: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
2590: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
25a0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
25b0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
25c0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
25d0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
25e0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
25f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2600: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2610: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2620: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2630: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2640: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2650: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2660: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2670: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
2680: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
2690: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
26a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
26b0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
26c0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
26d0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
26e0: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
26f0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2700: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2710: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2720: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2730: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2740: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2750: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2760: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2770: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
2780: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
2790: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
27a0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
27b0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
27c0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
27d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27e0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
27f0: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2800: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2810: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2820: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2830: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2840: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2850: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2860: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2870: 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66  & ((pOp->p1&0xff
2880: 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
2890: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
28a0: 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20  =OE_Abort)).    
28b0: 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72  ){.      hasAbor
28c0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  t = 1;.      bre
28d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
28e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
28f0: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
2900: 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
2910: 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72 74  true if hasAbort
2920: 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69  ==mayAbort. Or i
2930: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
2940: 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a  re occurred..  *
2950: 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  * If malloc fail
2960: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69  ed, then the whi
2970: 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20  le() loop above 
2980: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65  may not have ite
2990: 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75  rated.  ** throu
29a0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61  gh all opcodes a
29b0: 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20  nd hasAbort may 
29c0: 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74  be set incorrect
29d0: 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20  ly. Return.  ** 
29e0: 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 63 61  true for this ca
29f0: 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  se to prevent th
2a00: 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 74 68  e assert() in th
2a10: 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a  e callers frame.
2a20: 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e    ** from failin
2a30: 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  g.  */.  return 
2a40: 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( v->db->mallocF
2a50: 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72  ailed || hasAbor
2a60: 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d  t==mayAbort );.}
2a70: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2a80: 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71  E_DEBUG - the sq
2a90: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
2aa0: 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a  ort() function *
2ab0: 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68  /../*.** Loop th
2ac0: 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61  rough the progra
2ad0: 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32  m looking for P2
2ae0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
2af0: 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20   negative.** on 
2b00: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
2b10: 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 76 61  s.  Each such va
2b20: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20  lue is a label. 
2b30: 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20   Resolve the.** 
2b40: 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67  label by setting
2b50: 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f   the P2 value to
2b60: 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e   its correct non
2b70: 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  -zero value..**.
2b80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b90: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61  is called once a
2ba0: 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73  fter all opcodes
2bb0: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
2bc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61  ted..**.** Varia
2bd0: 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ble *pMaxFuncArg
2be0: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
2bf0: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  maximum value of
2c00: 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74   any P2 argument
2c10: 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75   .** to an OP_Fu
2c20: 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74  nction, OP_AggSt
2c30: 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72  ep or OP_VFilter
2c40: 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73   opcode. This is
2c50: 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c   used by .** sql
2c60: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
2c70: 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20  y() to size the 
2c80: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
2c90: 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70  ay..**.** The Op
2ca0: 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69  .opflags field i
2cb0: 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63  s set on all opc
2cc0: 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  odes..*/.static 
2cd0: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
2ce0: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
2cf0: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
2d00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
2d10: 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61   nMaxArgs = *pMa
2d20: 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20  xFuncArgs;.  Op 
2d30: 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  *pOp;.  int *aLa
2d40: 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b  bel = p->aLabel;
2d50: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  .  p->readOnly =
2d60: 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64   1;.  p->bIsRead
2d70: 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f  er = 0;.  for(pO
2d80: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
2d90: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
2da0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
2db0: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
2dc0: 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f 70 2d 3e  code;..    pOp->
2dd0: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
2de0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
2df0: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
2e00: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63   opcode==OP_Func
2e10: 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  tion || opcode==
2e20: 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20  OP_AggStep ){.  
2e30: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e      if( pOp->p5>
2e40: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
2e50: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20  rgs = pOp->p5;. 
2e60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
2e70: 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63 74  ode==OP_Transact
2e80: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ion ){.      if(
2e90: 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d   pOp->p2!=0 ) p-
2ea0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
2eb0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
2ec0: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 1;.    }else
2ed0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2ee0: 41 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c 20 6f 70  AutoCommit || op
2ef0: 63 6f 64 65 3d 3d 4f 50 5f 53 61 76 65 70 6f 69  code==OP_Savepoi
2f00: 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 62  nt ){.      p->b
2f10: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
2f20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
2f30: 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 0a 20 20  de==OP_Vacuum.  
2f40: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f           || opco
2f50: 64 65 3d 3d 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  de==OP_JournalMo
2f60: 64 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  de.#ifndef SQLIT
2f70: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
2f80: 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d        || opcode=
2f90: 3d 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 0a 23  =OP_Checkpoint.#
2fa0: 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2fb0: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
2fc0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 62 49 73   0;.      p->bIs
2fd0: 52 65 61 64 65 72 20 3d 20 31 3b 0a 23 69 66 6e  Reader = 1;.#ifn
2fe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ff0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
3000: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
3010: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b  e==OP_VUpdate ){
3020: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
3030: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
3040: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
3050: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3060: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74  opcode==OP_VFilt
3070: 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  er ){.      int 
3080: 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
3090: 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33   p->nOp - i >= 3
30a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
30b0: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
30c0: 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a  ==OP_Integer );.
30d0: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
30e0: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ].p1;.      if( 
30f0: 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  n>nMaxArgs ) nMa
3100: 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69  xArgs = n;.#endi
3110: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
3120: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20  opcode==OP_Next 
3130: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f  || opcode==OP_So
3140: 72 74 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  rterNext ){.    
3150: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3160: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3170: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70  eNext;.      pOp
3180: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
3190: 56 41 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65  VANCE;.    }else
31a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
31b0: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f  Prev ){.      pO
31c0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
31d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
31e0: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70  vious;.      pOp
31f0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
3200: 56 41 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  VANCE;.    }..  
3210: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
3220: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50  ags & OPFLG_JUMP
3230: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  )!=0 && pOp->p2<
3240: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
3250: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d  t( -1-pOp->p2<p-
3260: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
3270: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
3280: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3290: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
32a0: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
32b0: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d  p->aLabel);.  p-
32c0: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >aLabel = 0;.  *
32d0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
32e0: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
32f0: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3300: 3d 30 20 7c 7c 20 70 2d 3e 62 74 72 65 65 4d 61  =0 || p->btreeMa
3310: 73 6b 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  sk==0 );.}../*.*
3320: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
3330: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
3340: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3350: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3360: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3370: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3380: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3390: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
33a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
33b0: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
33c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
33d0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
33e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
33f0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
3400: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
3410: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
3420: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3430: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
3440: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3450: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3460: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3470: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3480: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3490: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
34a0: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
34b0: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
34c0: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
34d0: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
34e0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
34f0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3500: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
3510: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
3520: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
3530: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
3540: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3550: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3560: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3570: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3580: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3590: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
35a0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
35b0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
35c0: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
35d0: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
35e0: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
35f0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
3600: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
3610: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
3620: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
3630: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
3640: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3650: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3660: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3670: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3680: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3690: 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a  btreeMask==0 );.
36a0: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
36b0: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
36c0: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
36d0: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
36e0: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
36f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
3700: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
3710: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
3720: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
3730: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
3740: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
3750: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
3760: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3770: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
3780: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
3790: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
37a0: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
37b0: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
37c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
37d0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
37e0: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
37f0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
3800: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20   growOpArray(p) 
3810: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3820: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
3830: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41  >nOp;.  if( ALWA
3840: 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20  YS(nOp>0) ){.   
3850: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
3860: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
3870: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
3880: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
3890: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
38a0: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
38b0: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
38c0: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
38d0: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
38e0: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
38f0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
3900: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
3910: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
3920: 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70  <0 && (sqlite3Op
3930: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75  codeProperty[pOu
3940: 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  t->opcode] & OPF
3950: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20  LG_JUMP)!=0 ){. 
3960: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3970: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
3980: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3990: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
39a0: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
39b0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
39c0: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
39d0: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
39e0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
39f0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
3a00: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
3a10: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
3a20: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
3a30: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
3a40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64  ;.      if( p->d
3a50: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
3a60: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
3a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3a80: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
3a90: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
3aa0: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
3ab0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
3ac0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
3ad0: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
3ae0: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
3af0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3b00: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
3b10: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3b20: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3b30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3b40: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
3b50: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
3b60: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
3b70: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
3b80: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
3b90: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
3ba0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
3bb0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
3bc0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
3bd0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
3be0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
3bf0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
3c00: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
3c10: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3c20: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
3c30: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
3c40: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
3c50: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3c60: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3c70: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
3c80: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3c90: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3ca0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
3cb0: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
3cc0: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
3cd0: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
3ce0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3cf0: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
3d00: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
3d10: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3d20: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
3d30: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
3d40: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
3d50: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
3d60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3d70: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3d80: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
3d90: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3da0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
3db0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3dc0: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
3dd0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
3de0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
3df0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
3e00: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
3e10: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
3e20: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
3e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3e40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
3e50: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
3e60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3e70: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
3e80: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
3e90: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3ea0: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
3eb0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3ec0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3ed0: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
3ee0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
3ef0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
3f00: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
3f10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3f20: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
3f30: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
3f40: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
3f50: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
3f60: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
3f70: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
3f80: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
3f90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3fa0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
3fb0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
3fc0: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3fd0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
3fe0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
3ff0: 61 64 64 72 3e 3d 30 20 29 20 73 71 6c 69 74 65  addr>=0 ) sqlite
4000: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
4010: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
4020: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
4030: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
4040: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
4050: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
4060: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
4070: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
4080: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
4090: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
40a0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
40b0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
40c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
40d0: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
40e0: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
40f0: 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  & (pDef->flags &
4100: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
4110: 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  EM)!=0 ){.    sq
4120: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4130: 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  pDef);.  }.}..st
4140: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
4150: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
4160: 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b  3 *, Op *, int);
4170: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
4180: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
4190: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
41a0: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
41b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
41c0: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
41d0: 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20  {.  if( p4 ){.  
41e0: 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a    assert( db );.
41f0: 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74 79      switch( p4ty
4200: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
4210: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20   P4_REAL:.      
4220: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
4230: 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e       case P4_DYN
4240: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
4250: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P4_KEYINFO:.   
4260: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
4270: 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20  RAY:.      case 
4280: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
4290: 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  FF: {.        sq
42a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
42b0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
42c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
42d0: 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54    case P4_MPRINT
42e0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  F: {.        if(
42f0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4300: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66  d==0 ) sqlite3_f
4310: 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20  ree(p4);.       
4320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4330: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
4340: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
4350: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4360: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
4370: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
4380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4390: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
43a0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  EM: {.        if
43b0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
43c0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
43d0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
43e0: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
43f0: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
4400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4410: 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a    Mem *p = (Mem*
4420: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  )p4;.          s
4430: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4440: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
4450: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4460: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
4470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4480: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4490: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
44a0: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
44b0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
44c0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
44d0: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
44e0: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
44f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4500: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4510: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
4520: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
4530: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
4540: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
4550: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
4560: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
4570: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
4580: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
4590: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
45a0: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
45b0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
45c0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
45d0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
45e0: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
45f0: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
4600: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
4610: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
4620: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
4630: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
4640: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
4650: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
4660: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4670: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
4680: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
4690: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
46a0: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
46b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
46c0: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
46d0: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
46e0: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
46f0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
4700: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
4710: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
4720: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
4730: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
4740: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
4750: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
4760: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
4770: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
4780: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
4790: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
47a0: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
47b0: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
47c0: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
47d0: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
47e0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
47f0: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
4800: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
4810: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
4820: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
4830: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73  P_Noop.*/.void s
4840: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4850: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
4860: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28  int addr){.  if(
4870: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
4880: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
4890: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
48a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
48b0: 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28  >db;.    freeP4(
48c0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
48d0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
48e0: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
48f0: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
4900: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
4910: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a   = OP_Noop;.  }.
4920: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4930: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4940: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
4950: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
4960: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
4970: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
4980: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
4990: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
49a0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
49b0: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
49c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
49d0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
49e0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
49f0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
4a00: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
4a10: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
4a20: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4a30: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4a40: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4a50: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4a60: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4a70: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4a80: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4a90: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4aa0: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4ab0: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4ac0: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4ad0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
4ae0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
4af0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
4b00: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
4b10: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
4b20: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
4b30: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
4b40: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
4b50: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
4b60: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
4b70: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
4b80: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
4b90: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4ba0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
4bb0: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
4bc0: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4bd0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
4be0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
4bf0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
4c00: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4c10: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4c20: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
4c30: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
4c40: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
4c50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4c60: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
4c70: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
4c80: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
4c90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
4ca0: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
4cb0: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
4cc0: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
4cd0: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
4ce0: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
4cf0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
4d00: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
4d10: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
4d20: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
4d30: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
4d40: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
4d50: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
4d60: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
4d70: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
4d80: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
4d90: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
4da0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
4db0: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
4dc0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
4dd0: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
4de0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4df0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4e00: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
4e10: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
4e20: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
4e30: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
4e40: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4e50: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4e60: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
4e70: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4e80: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4e90: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4ea0: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
4eb0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4ec0: 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e  if ( n!=P4_KEYIN
4ed0: 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  FO && n!=P4_VTAB
4ee0: 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50   ) {.      freeP
4ef0: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4f00: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4f10: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4f20: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4f30: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
4f40: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
4f50: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
4f60: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
4f70: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
4f80: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4f90: 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72 74 28  addr];.  assert(
4fa0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
4fb0: 5f 4e 4f 54 55 53 45 44 20 7c 7c 20 70 4f 70 2d  _NOTUSED || pOp-
4fc0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
4fd0: 32 20 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62  2 );.  freeP4(db
4fe0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4ff0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
5000: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
5010: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
5020: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
5030: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
5040: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
5050: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
5060: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
5070: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
5080: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
5090: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
50a0: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
50b0: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
50c0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
50d0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
50e0: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
50f0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
5100: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
5110: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
5120: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
5130: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
5140: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
5150: 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46  Info;.    int nF
5160: 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20  ield, nByte;..  
5170: 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79    nField = ((Key
5180: 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65  Info*)zP4)->nFie
5190: 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ld;.    nByte = 
51a0: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
51b0: 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73  ) + (nField-1)*s
51c0: 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e  izeof(pKeyInfo->
51d0: 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65  aColl[0]) + nFie
51e0: 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ld;.    pKeyInfo
51f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5200: 6f 63 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b  ocRaw(0, nByte);
5210: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
5220: 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
5230: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e  ;.    if( pKeyIn
5240: 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  fo ){.      u8 *
5250: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
5260: 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29    memcpy((char*)
5270: 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e  pKeyInfo, zP4, n
5280: 42 79 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a  Byte - nField);.
5290: 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72        aSortOrder
52a0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
52b0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 61  rtOrder;.      a
52c0: 73 73 65 72 74 28 20 61 53 6f 72 74 4f 72 64 65  ssert( aSortOrde
52d0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4b  r!=0 );.      pK
52e0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
52f0: 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  er = (unsigned c
5300: 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e  har*)&pKeyInfo->
5310: 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aColl[nField];. 
5320: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
5330: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5340: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
5350: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 70 4f 70  ield);.      pOp
5360: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
5370: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
5380: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
5390: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
53a0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
53b0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
53c0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
53d0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
53e0: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
53f0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
5400: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
5410: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
5420: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
5430: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n==P4_VTAB ){.
5440: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5450: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
5460: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5470: 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74  _VTAB;.    sqlit
5480: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62  e3VtabLock((VTab
5490: 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61  le *)zP4);.    a
54a0: 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20  ssert( ((VTable 
54b0: 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64  *)zP4)->db==p->d
54c0: 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  b );.  }else if(
54d0: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
54e0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
54f0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5500: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68  ype = (signed ch
5510: 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ar)n;.  }else{. 
5520: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
5530: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5540: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
5550: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
5560: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
5570: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
5580: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
5590: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
55a0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
55b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
55c0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  mment on the mos
55d0: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
55e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
55f0: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
5600: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
5610: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
5620: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
5630: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
5640: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
5650: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
5660: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
5670: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
5680: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
5690: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
56a0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
56b0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
56c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
56d0: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
56e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
56f0: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
5700: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
5710: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
5720: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
5730: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
5740: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5750: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
5760: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
5770: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
5780: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5790: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
57a0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
57b0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
57c0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
57d0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
57e0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
57f0: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
5800: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
5810: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
5820: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
5830: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
5840: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
5850: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5860: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
5870: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
5880: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5890: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
58a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
58b0: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
58c0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
58d0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
58e0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
58f0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
5900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
5910: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
5920: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
5930: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
5940: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
5950: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
5960: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
5970: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
5980: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5990: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
59a0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
59b0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
59c0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
59d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
59e0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
59f0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
5a00: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
5a10: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
5a20: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
5a30: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
5a40: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
5a50: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
5a60: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
5a70: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
5a80: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
5a90: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
5aa0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
5ab0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
5ac0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
5ad0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
5ae0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
5af0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
5b00: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
5b10: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
5b20: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f  ing.** after a O
5b30: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
5b40: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
5b50: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
5b60: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
5b70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
5b80: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
5b90: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
5ba0: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
5bb0: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
5bc0: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
5bd0: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
5be0: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
5bf0: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
5c00: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
5c10: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a  th Valgrind..**.
5c20: 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66  ** About the #if
5c30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5c40: 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79  TRACE:  Normally
5c50: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5c60: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a  s never called.*
5c70: 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e  * unless p->nOp>
5c80: 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  0.  This is beca
5c90: 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e  use in the absen
5ca0: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
5cb0: 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f  T_TRACE,.** an O
5cc0: 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74  P_Trace instruct
5cd0: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e  ion is always in
5ce0: 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  serted by sqlite
5cf0: 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f  3VdbeGet() as so
5d00: 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56  on as.** a new V
5d10: 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20  DBE is created. 
5d20: 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20   So we are free 
5d30: 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70  to set addr to p
5d40: 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a  ->nOp-1 without.
5d50: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75  ** having to dou
5d60: 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ble-check to mak
5d70: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
5d80: 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65  result is non-ne
5d90: 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69  gative. But.** i
5da0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5db0: 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20  ACE is defined, 
5dc0: 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20  the OP_Trace is 
5dd0: 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64  omitted and we d
5de0: 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65  o need to.** che
5df0: 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ck the value of 
5e00: 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20  p->nOp-1 before 
5e10: 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56  continuing..*/.V
5e20: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5e30: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
5e40: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
5e50: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
5e60: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
5e70: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
5e80: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
5e90: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
5ea0: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
5eb0: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
5ec0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
5ed0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
5ee0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
5ef0: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
5f00: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
5f10: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
5f20: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
5f30: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
5f40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
5f50: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
5f60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5f70: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
5f80: 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74   p->nOp==0 ) ret
5f90: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
5fa0: 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mmy;.#endif.    
5fb0: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
5fc0: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
5fd0: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
5fe0: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
5ff0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6000: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
6010: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6020: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
6030: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
6040: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6050: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
6060: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6070: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6080: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
6090: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
60a0: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
60b0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
60c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
60d0: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
60e0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
60f0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
6100: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
6110: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
6120: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
6130: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
6140: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
6150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
6160: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
6170: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
6180: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
6190: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
61a0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
61b0: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
61c0: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
61d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
61e0: 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20  EYINFO_STATIC:. 
61f0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
6200: 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  FO: {.      int 
6210: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  i, j;.      KeyI
6220: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
6230: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
6240: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6250: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
6260: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
6270: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6280: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6290: 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b  "keyinfo(%d", pK
62a0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
62b0: 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74  .      i = sqlit
62c0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
62d0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
62e0: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
62f0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
6300: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6310: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
6320: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
6330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
6340: 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f  ll = pColl ? pCo
6350: 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c  ll->zName : "nil
6360: 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ";.        int n
6370: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6380: 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  30(zColl);.     
6390: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
63a0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
63b0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
63c0: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
63d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
63e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
63f0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
6400: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
6410: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
6420: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
6430: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
6440: 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -';.        }.  
6450: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
6460: 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e  emp[i], zColl, n
6470: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  +1);.        i +
6480: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
6490: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
64a0: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
64b0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
64c0: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
64d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
64e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
64f0: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
6500: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6510: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
6520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6530: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6540: 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28  zTemp, "collseq(
6550: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
6560: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
6570: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6580: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
6590: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
65a0: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
65b0: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
65c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
65d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
65e0: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
65f0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
6600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6610: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
6620: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
6630: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6640: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
6650: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
6660: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
6670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6680: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
6690: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
66a0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
66b0: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
66c0: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
66d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
66e0: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
66f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6700: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6710: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
6720: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
6730: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6740: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
6750: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
6760: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
6770: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
6780: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
6790: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
67a0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
67b0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
67c0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
67d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
67e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
67f0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
6800: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
6810: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
6820: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6830: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
6840: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6850: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6860: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29  %.16g", pMem->r)
6870: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6880: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
6890: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
68a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
68b0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
68c0: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
68d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
68e0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
68f0: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
6900: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
6910: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
6920: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6930: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
6940: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6950: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
6960: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
6970: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
6980: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
6990: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
69a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
69b0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
69c0: 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20  , "vtab:%p:%p", 
69d0: 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d  pVtab, pVtab->pM
69e0: 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  odule);.      br
69f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6a00: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
6a10: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
6a20: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6a30: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6a40: 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20  intarray");.    
6a50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6a60: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
6a70: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
6a80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6a90: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70  nTemp, zTemp, "p
6aa0: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
6ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6ac0: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
6ad0: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
6ae0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
6af0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6b00: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6b10: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
6b20: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
6b30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
6b40: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
6b50: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
6b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6b70: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  }.  assert( zP4!
6b80: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
6b90: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  P4;.}.#endif../*
6ba0: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
6bb0: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
6bc0: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
6bd0: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
6be0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  sed..**.** The p
6bf0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6c00: 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ts need to know 
6c10: 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63  in advance the c
6c20: 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a  omplete set of.*
6c30: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
6c40: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ases that will b
6c50: 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f  e use.  A mask o
6c60: 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65  f these database
6c70: 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e  s.** is maintain
6c80: 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ed in p->btreeMa
6c90: 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b  sk.  The p->lock
6ca0: 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68  Mask value is th
6cb0: 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70  e subset of.** p
6cc0: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64  ->btreeMask of d
6cd0: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
6ce0: 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63  ll require a loc
6cf0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
6d00: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
6d10: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b  Vdbe *p, int i){
6d20: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
6d30: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
6d40: 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  && i<(int)sizeof
6d50: 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  (yDbMask)*8 );. 
6d60: 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29   assert( i<(int)
6d70: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
6d80: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70 2d 3e 62  ask)*8 );.  p->b
6d90: 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44  treeMask |= ((yD
6da0: 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 69  bMask)1)<<i;.  i
6db0: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
6dc0: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
6dd0: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
6de0: 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63  t) ){.    p->loc
6df0: 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61  kMask |= ((yDbMa
6e00: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a  sk)1)<<i;.  }.}.
6e10: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6e20: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
6e30: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
6e40: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
6e50: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
6e60: 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75  s compiled to su
6e70: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
6e80: 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62  he mode and to b
6e90: 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a  e threadsafe,.**
6ea0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62   this routine ob
6eb0: 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20  tains the mutex 
6ec0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6ed0: 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74  each BtShared st
6ee0: 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20  ructure.** that 
6ef0: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
6f00: 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
6f10: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
6f20: 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20   In doing so it 
6f30: 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65  also.** sets the
6f40: 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d   BtShared.db mem
6f50: 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74  ber of each of t
6f60: 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
6f70: 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67  ctures, ensuring
6f80: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72  .** that the cor
6f90: 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65  rect busy-handle
6fa0: 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  r callback is in
6fb0: 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65  voked if require
6fc0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  d..**.** If SQLi
6fd0: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
6fe0: 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75  safe but does su
6ff0: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
7000: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a  he mode, then.**
7010: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
7020: 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20  er() is invoked 
7030: 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61  to set the BtSha
7040: 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73  red.db variables
7050: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74  .** of all of Bt
7060: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
7070: 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61  s accessible via
7080: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
7090: 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61  ndle .** associa
70a0: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e  ted with the VM.
70b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
70c0: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
70d0: 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  fe and does not 
70e0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
70f0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a  ache mode, this.
7100: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
7110: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
7120: 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66  e p->btreeMask f
7130: 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73  ield is a bitmas
7140: 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20  k of all btrees 
7150: 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65  that the prepare
7160: 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  d .** statement 
7170: 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e  p will ever use.
7180: 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e    Let N be the n
7190: 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e  umber of bits in
71a0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a   p->btreeMask.**
71b0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
71c0: 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73  o btrees that us
71d0: 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20  e shared cache. 
71e0: 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d   Then the runtim
71f0: 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75  e of.** this rou
7200: 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75  tine is N*N.  Bu
7210: 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79  t as N is rarely
7220: 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68   more than 1, th
7230: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  is should not.**
7240: 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a   be a problem..*
7250: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7260: 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29  beEnter(Vdbe *p)
7270: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62  {.  int i;.  yDb
7280: 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c  Mask mask;.  sql
7290: 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
72a0: 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a  aDb;.  int nDb;.
72b0: 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73    if( p->lockMas
72c0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  k==0 ) return;  
72d0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
72e0: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
72f0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
7300: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
7310: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  >nDb;.  for(i=0,
7320: 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20   mask=1; i<nDb; 
7330: 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73  i++, mask += mas
7340: 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  k){.    if( i!=1
7350: 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c   && (mask & p->l
7360: 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41  ockMask)!=0 && A
7370: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
7380: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
7390: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
73a0: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
73b0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
73c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
73d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
73e0: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
73f0: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
7400: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
7410: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
7420: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
7430: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
7440: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
7450: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7460: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
7470: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 79  p){.  int i;.  y
7480: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 73  DbMask mask;.  s
7490: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
74a0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
74b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d  ;.  if( p->lockM
74c0: 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ask==0 ) return;
74d0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
74e0: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
74f0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
7500: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
7510: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
7520: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44 62  0, mask=1; i<nDb
7530: 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d  ; i++, mask += m
7540: 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  ask){.    if( i!
7550: 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70 2d  =1 && (mask & p-
7560: 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26 26  >lockMask)!=0 &&
7570: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
7580: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
7590: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
75a0: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  e(aDb[i].pBt);. 
75b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
75c0: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  f..#if defined(V
75d0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
75e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
75f0: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
7600: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
7610: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7620: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
7630: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
7640: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7650: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
7660: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
7670: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
7680: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
7690: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
76a0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
76b0: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
76c0: 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20  4d %4d %4d %-4s 
76d0: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
76e0: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
76f0: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
7700: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
7710: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
7720: 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66  Ptr));.  fprintf
7730: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
7740: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
7750: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
7760: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
7770: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
7780: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
7790: 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  >p5,.#ifdef SQLI
77a0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70  TE_DEBUG.      p
77b0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70  Op->zComment ? p
77c0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22  Op->zComment : "
77d0: 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22  ".#else.      ""
77e0: 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66  .#endif.  );.  f
77f0: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
7800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
7810: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
7820: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
7830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
7840: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
7850: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
7860: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
7870: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20     Mem *pEnd;.  
7880: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7890: 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61  p->db;.    u8 ma
78a0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62  lloc_failed = db
78b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
78c0: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
78d0: 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20  tesFreed ){.    
78e0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
78f0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
7900: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7910: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
7920: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lloc);.      }. 
7930: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7940: 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d   }.    for(pEnd=
7950: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
7960: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
7970: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
7980: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
7990: 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f  ].db );..      /
79a0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
79b0: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
79c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
79d0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
79e0: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
79f0: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
7a00: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
7a10: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
7a20: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
7a30: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
7a40: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
7a50: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
7a60: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
7a70: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
7a80: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
7a90: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
7aa0: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
7ab0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
7ac0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
7ad0: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
7ae0: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
7af0: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
7b00: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
7b10: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
7b20: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
7b30: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
7b40: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
7b50: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
7b60: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
7b70: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
7b80: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
7b90: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
7ba0: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
7bb0: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
7bc0: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
7bd0: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
7be0: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
7bf0: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
7c00: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
7c10: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
7c20: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
7c30: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
7c40: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
7c50: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
7c60: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
7c70: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
7c80: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
7c90: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
7ca0: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
7cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7cc0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
7cd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7ce0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  p->zMalloc ){.  
7cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7d00: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
7d10: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
7d20: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
7d30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
7d40: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c  lags = MEM_Inval
7d50: 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  id;.    }.    db
7d60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
7d70: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a   malloc_failed;.
7d80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
7d90: 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20  ete a VdbeFrame 
7da0: 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63  object and its c
7db0: 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61  ontents. VdbeFra
7dc0: 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a  me objects are.*
7dd0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
7de0: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  he OP_Program op
7df0: 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56  code in sqlite3V
7e00: 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f  dbeExec()..*/.vo
7e10: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
7e20: 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72  ameDelete(VdbeFr
7e30: 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ame *p){.  int i
7e40: 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  ;.  Mem *aMem = 
7e50: 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b  VdbeFrameMem(p);
7e60: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  .  VdbeCursor **
7e70: 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
7e80: 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
7e90: 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f  nChildMem];.  fo
7ea0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69  r(i=0; i<p->nChi
7eb0: 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ldCsr; i++){.   
7ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
7ed0: 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43  Cursor(p->v, apC
7ee0: 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  sr[i]);.  }.  re
7ef0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d  leaseMemArray(aM
7f00: 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  em, p->nChildMem
7f10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
7f20: 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b  ee(p->v->db, p);
7f30: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
7f40: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
7f50: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
7f60: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
7f70: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
7f80: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
7f90: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
7fa0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
7fb0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
7fc0: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
7fd0: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
7fe0: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
7ff0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
8000: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
8010: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
8020: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
8030: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
8040: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  EXPLAIN"..**.** 
8050: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
8060: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63  =1, each instruc
8070: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20  tion is listed. 
8080: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c   When.** p->expl
8090: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f  ain==2, only OP_
80a0: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
80b0: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20  ions are listed 
80c0: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65  and these.** are
80d0: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66   shown in a diff
80e0: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70  erent format.  p
80f0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20  ->explain==2 is 
8100: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
8110: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  t.** EXPLAIN QUE
8120: 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57  RY PLAN..**.** W
8130: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
8140: 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69  1, first the mai
8150: 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73  n program is lis
8160: 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f  ted, then each o
8170: 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  f.** the trigger
8180: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
8190: 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f   listed one by o
81a0: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
81b0: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
81c0: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
81d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
81e0: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
81f0: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8210: 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f   /* Stop when ro
8220: 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  w count reaches 
8230: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  this */.  int nS
8240: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8260: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d  * Number of sub-
8270: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61  vdbes seen so fa
8280: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  r */.  SubProgra
8290: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20  m **apSub = 0;  
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
82b0: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65  rray of sub-vdbe
82c0: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62  s */.  Mem *pSub
82d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
82f0: 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20  emory cell hold 
8300: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
8310: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
8320: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
8330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8340: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
8350: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
8360: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8390: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
83a0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
83b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
83c0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
83d0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
83e0: 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Mem[1];         
83f0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
8400: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
8410: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
8420: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
8430: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8440: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
8450: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
8460: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
8470: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
8480: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
8490: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
84a0: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
84b0: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
84c0: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
84d0: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
84e0: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
84f0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
8500: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
8510: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
8520: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
8530: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
8540: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
8550: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
8560: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
8570: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
8580: 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52  Mem, 8);.  p->pR
8590: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20  esultSet = 0;.. 
85a0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
85b0: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
85c0: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
85d0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
85e0: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
85f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
8600: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
8610: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
8620: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
8630: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
8640: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
8650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
8660: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
8670: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
8680: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72  of output rows r
8690: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61  eaches nRow, tha
86a0: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a  t means the.  **
86b0: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e   listing has fin
86c0: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65  ished and sqlite
86d0: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20  3_step() should 
86e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
86f0: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73  NE..  ** nRow is
8700: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8710: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
8720: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  n the main progr
8730: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68  am, plus.  ** th
8740: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
8750: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61  ber of rows in a
8760: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ll trigger subpr
8770: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72  ograms encounter
8780: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20  ed.  ** so far. 
8790: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
87a0: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73  will increase as
87b0: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62   new trigger sub
87c0: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a  programs are.  *
87d0: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62  * encountered, b
87e0: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76  ut p->pc will ev
87f0: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75  entually catch u
8800: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a  p to nRow..  */.
8810: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b    nRow = p->nOp;
8820: 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69  .  if( p->explai
8830: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==1 ){.    /* T
8840: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72  he first 8 memor
8850: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64  y cells are used
8860: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
8870: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c  set.  So we will
8880: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65  .    ** commande
8890: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20  er the 9th cell 
88a0: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67  to use as storag
88b0: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f  e for an array o
88c0: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a  f pointers.    *
88d0: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62  * to trigger sub
88e0: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56  programs.  The V
88f0: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65  DBE is guarantee
8900: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61  d to have at lea
8910: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  st 9.    ** cell
8920: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
8930: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a  t( p->nMem>9 );.
8940: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61      pSub = &p->a
8950: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20  Mem[9];.    if( 
8960: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pSub->flags&MEM_
8970: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Blob ){.      /*
8980: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   On the first ca
8990: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ll to sqlite3_st
89a0: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20  ep(), pSub will 
89b0: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74  hold a NULL.  It
89c0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69   is.      ** ini
89d0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c  tialized to a BL
89e0: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42  OB by the P4_SUB
89f0: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69  PROGRAM processi
8a00: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a  ng logic below *
8a10: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70  /.      nSub = p
8a20: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64  Sub->n/sizeof(Vd
8a30: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75  be*);.      apSu
8a40: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
8a50: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
8a60: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
8a70: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSub; i++){.   
8a80: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62     nRow += apSub
8a90: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  [i]->nOp;.    }.
8aa0: 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69    }..  do{.    i
8ab0: 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77   = p->pc++;.  }w
8ac0: 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20  hile( i<nRow && 
8ad0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
8ae0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
8af0: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
8b00: 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29  .  if( i>=nRow )
8b10: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
8b20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
8b30: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
8b40: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75   }else if( db->u
8b50: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
8b60: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
8b70: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
8b80: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8b90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
8ba0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
8bb0: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
8bc0: 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
8bd0: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
8be0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
8bf0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
8c00: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
8c10: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
8c20: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
8c30: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
8c40: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
8c50: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
8c60: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
8c70: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
8c80: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
8c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8ca0: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
8cb0: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
8cc0: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
8cd0: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
8ce0: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
8cf0: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
8d00: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
8d10: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
8d20: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
8d30: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61     for(j=0; i>=a
8d40: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b  pSub[j]->nOp; j+
8d50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d  +){.        i -=
8d60: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a   apSub[j]->nOp;.
8d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
8d80: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61  p = &apSub[j]->a
8d90: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Op[i];.    }.   
8da0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
8db0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
8dc0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
8dd0: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  t;.      pMem->t
8de0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
8df0: 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d  EGER;.      pMem
8e00: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
8e30: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
8e40: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
8e50: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8e60: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
8e70: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
8e80: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
8e90: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
8ea0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
8eb0: 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63  opcode);  /* Opc
8ec0: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
8ed0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
8ee0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
8ef0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
8f00: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
8f10: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
8f20: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
8f30: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
8f40: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
8f50: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
8f60: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
8f70: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
8f80: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
8f90: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
8fa0: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
8fb0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
8fc0: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
8fd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
8fe0: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
8ff0: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
9000: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
9010: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
9020: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
9030: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
9040: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
9050: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
9060: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
9070: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
9080: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
9090: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
90a0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
90b0: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
90c0: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
90d0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
90e0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
90f0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
9100: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
9110: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
9120: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
9130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
9140: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
9150: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
9160: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
9170: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
9180: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
9190: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
91a0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
91b0: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
91c0: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
91d0: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
91e0: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
91f0: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
9200: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
9210: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
9220: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
9230: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9240: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
9250: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
9260: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
9270: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
92a0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
92b0: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
92c0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
92d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
92e0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
92f0: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
9320: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9330: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
9340: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
9350: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
9360: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
9370: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
93a0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
93b0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
93c0: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
93d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
93e0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
93f0: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
9400: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
9410: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9420: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9430: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
9440: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9450: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
9460: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
9470: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9480: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
9490: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
94a0: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
94b0: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
94c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
94d0: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
94e0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
94f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
9500: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9510: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
9520: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
9530: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
9540: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
9550: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
9560: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
9570: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9580: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
9590: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
95a0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
95b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
95c0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
95d0: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
95e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
95f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9600: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
9610: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
9630: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9640: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
9650: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
9660: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
9670: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9680: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
9690: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
96a0: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
96b0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
96c0: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
96d0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
96e0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
96f0: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
9700: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
9710: 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d     if( pOp->zCom
9720: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
9730: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9740: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
9750: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
9760: 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b  = pOp->zComment;
9770: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
9780: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9790: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
97a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
97b0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
97c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
97d0: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
97e0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
97f0: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
9800: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9810: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
9840: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
9850: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
9860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9870: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
9880: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
9890: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
98a0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
98b0: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70  ->aMem[1];.    p
98c0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
98d0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
98e0: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
98f0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
9900: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9910: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
9920: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9930: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
9940: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
9950: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
9960: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
9970: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9980: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
9990: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
99a0: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
99b0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
99c0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
99d0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
99e0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
99f0: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
9a00: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
9a10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9a20: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
9a30: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
9a40: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
9a50: 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ++;.    printf("
9a60: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
9a70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
9a80: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9a90: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
9aa0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9ab0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
9ac0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
9ad0: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
9ae0: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
9af0: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
9b00: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
9b10: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
9b20: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
9b30: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
9b40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
9b50: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
9b60: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
9b70: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
9b80: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
9b90: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
9ba0: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
9bb0: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
9bc0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
9bd0: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
9be0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9bf0: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
9c00: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
9c10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
9c20: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
9c30: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
9c40: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
9c50: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
9c60: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
9c70: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
9c80: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
9c90: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
9ca0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
9cb0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
9cc0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
9cd0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
9ce0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
9cf0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
9d00: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
9d10: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
9d20: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
9d30: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
9d40: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
9d50: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  E */../*.** Allo
9d60: 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20  cate space from 
9d70: 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66  a fixed size buf
9d80: 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61  fer and return a
9d90: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74   pointer to.** t
9da0: 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69  hat space.  If i
9db0: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
9dc0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
9dd0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
9de0: 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61  ** The pBuf para
9df0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69  meter is the ini
9e00: 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20  tial value of a 
9e10: 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69  pointer which wi
9e20: 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68  ll.** receive th
9e30: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70  e new memory.  p
9e40: 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  Buf is normally 
9e50: 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69  NULL.  If pBuf i
9e60: 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69  s not.** NULL, i
9e70: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d  t means that mem
9e80: 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c  ory space has al
9e90: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
9ea0: 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a  ated and that.**
9eb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
9ec0: 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  ould not allocat
9ed0: 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79  e any new memory
9ee0: 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20  .  When pBuf is 
9ef0: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70  not.** NULL simp
9f00: 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20  ly return pBuf. 
9f10: 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e   Only allocate n
9f20: 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  ew memory space 
9f30: 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20  when pBuf.** is 
9f40: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74  NULL..**.** nByt
9f50: 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
9f60: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
9f70: 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  e needed..**.** 
9f80: 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74  *ppFrom points t
9f90: 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  o available spac
9fa0: 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74  e and pEnd point
9fb0: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
9fc0: 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  the.** available
9fd0: 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70   space.  When sp
9fe0: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
9ff0: 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76  , *ppFrom is adv
a000: 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68  anced past.** th
a010: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c  e end of the all
a020: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a  ocated space..**
a030: 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61  .** *pnByte is a
a040: 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20   counter of the 
a050: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a060: 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61  of space that ha
a070: 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20  ve failed.** to 
a080: 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68  allocate.  If th
a090: 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69  ere is insuffici
a0a0: 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70  ent space in *pp
a0b0: 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20  From to satisfy 
a0c0: 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20  the.** request, 
a0d0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a  then increment *
a0e0: 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d  pnByte by the am
a0f0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75  ount of the requ
a100: 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  est..*/.static v
a110: 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28  oid *allocSpace(
a120: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
a130: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
a140: 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20   return pointer 
a150: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a  will be stored *
a160: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
a170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a180: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
a190: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20  llocate */.  u8 
a1a0: 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20  **ppFrom,       
a1b0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c    /* IN/OUT: All
a1c0: 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72  ocate from *ppFr
a1d0: 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  om */.  u8 *pEnd
a1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
a1f0: 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74  Pointer to 1 byt
a200: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
a210: 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72  f *ppFrom buffer
a220: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74   */.  int *pnByt
a230: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e          /* If
a240: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e   allocation cann
a250: 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72  ot be made, incr
a260: 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f  ement *pnByte */
a270: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49  .){.  assert( EI
a280: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
a290: 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20  NT(*ppFrom) );. 
a2a0: 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75   if( pBuf ) retu
a2b0: 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65  rn pBuf;.  nByte
a2c0: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
a2d0: 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f  ;.  if( &(*ppFro
a2e0: 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e  m)[nByte] <= pEn
a2f0: 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20  d ){.    pBuf = 
a300: 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a  (void*)*ppFrom;.
a310: 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e      *ppFrom += n
a320: 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Byte;.  }else{. 
a330: 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42     *pnByte += nB
a340: 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
a350: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
a360: 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45   Rewind the VDBE
a370: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
a380: 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72  inning in prepar
a390: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e  ation for.** run
a3a0: 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  ning it..*/.void
a3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
a3c0: 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  nd(Vdbe *p){.#if
a3d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a3e0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
a3f0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
a400: 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
a410: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
a420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
a430: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
a440: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
a450: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
a460: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
a470: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
a480: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
a490: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
a4a0: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
a4b0: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
a4c0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
a4d0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
a4e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
a4f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a500: 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  BUG.  for(i=1; i
a510: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
a520: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
a530: 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62  Mem[i].db==p->db
a540: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
a550: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
a560: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
a570: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
a580: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
a590: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
a5a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
a5b0: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
a5c0: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
a5d0: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
a5e0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
a5f0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
a600: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e  = 0;.  p->nFkCon
a610: 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66  straint = 0;.#if
a620: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
a630: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
a640: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
a650: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
a660: 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  0;.    p->aOp[i]
a670: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d  .cycles = 0;.  }
a680: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
a690: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
a6a0: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
a6b0: 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65  xecution for the
a6c0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65   first time afte
a6d0: 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68  r.** creating th
a6e0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
a6f0: 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  e.  This involve
a700: 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a  s things such.**
a710: 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73   as allocating s
a720: 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69  tack space and i
a730: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
a740: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
a750: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
a760: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
a770: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
a780: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
a790: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
a7a0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
a7b0: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
a7c0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
a7d0: 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e   called exact on
a7e0: 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69 72  ce on a each vir
a7f0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
a800: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
a810: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
a820: 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
a830: 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
a840: 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
a850: 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
a860: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
a870: 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  futher calls to 
a880: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
a890: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
a8a0: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
a8b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
a8c0: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
a8d0: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
a8e0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
a8f0: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
a900: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
a910: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
a920: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
a930: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
a940: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
a950: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
a960: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
a970: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
a980: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
a990: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
a9a0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
a9b0: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
a9c0: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
a9d0: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
a9e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a9f0: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
aa00: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
aa30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
aa60: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
aa70: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
aa80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
aa90: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
aaa0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
aab0: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
aac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
aad0: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
aae0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ab10: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
ab20: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
ab30: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
ab40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ab50: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
ab60: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
ab70: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab90: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
aba0: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
abb0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63  ms */.  int nOnc
abc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
abd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
abe0: 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   of OP_Once inst
abf0: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
ac00: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac20: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
ac30: 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20 20    u8 *zCsr;     
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c   /* Memory avail
ac60: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
ac70: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e  ion */.  u8 *zEn
ac80: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
ac90: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
aca0: 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f 63   byte past alloc
acb0: 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ated memory */. 
acc0: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72  /* How much extr
acf0: 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65 64  a memory is need
ad00: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
ad10: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
ad20: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
ad30: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
ad40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ad50: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
ad60: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 64  AGIC_INIT );.  d
ad70: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
ad80: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
ad90: 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56  ailed==0 );.  nV
ada0: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  ar = pParse->nVa
adb0: 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72  r;.  nMem = pPar
adc0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72  se->nMem;.  nCur
add0: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
ade0: 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61  ab;.  nArg = pPa
adf0: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20  rse->nMaxArg;.  
ae00: 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e  nOnce = pParse->
ae10: 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e  nOnce;.  if( nOn
ae20: 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20  ce==0 ) nOnce = 
ae30: 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20  1; /* Ensure at 
ae40: 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69  least one byte i
ae50: 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d  n p->aOnceFlag[]
ae60: 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20   */.  .  /* For 
ae70: 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75  each cursor requ
ae80: 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63  ired, also alloc
ae90: 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ate a memory cel
aea0: 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63  l. Memory.  ** c
aeb0: 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75  ells (nMem+1-nCu
aec0: 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63  rsor)..nMem, inc
aed0: 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76  lusive, will nev
aee0: 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20  er be used by.  
aef0: 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  ** the vdbe prog
af00: 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65  ram. Instead the
af10: 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c  y are used to al
af20: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
af30: 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72  .  ** VdbeCursor
af40: 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74  /BtCursor struct
af50: 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f  ures. The blob o
af60: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
af70: 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63  ted with .  ** c
af80: 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65  ursor 0 is store
af90: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  d in memory cell
afa0: 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65   nMem. Memory ce
afb0: 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a  ll (nMem-1).  **
afc0: 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62   stores the blob
afd0: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
afe0: 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
aff0: 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  r 1, etc..  **. 
b000: 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c   ** See also: al
b010: 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a  locateCursor()..
b020: 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e    */.  nMem += n
b030: 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c  Cursor;..  /* Al
b040: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
b050: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
b060: 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  s, SQL variables
b070: 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61  , VDBE cursors a
b080: 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61  nd .  ** an arra
b090: 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c  y to marshal SQL
b0a0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
b0b0: 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a  nts in..  */.  z
b0c0: 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  Csr = (u8*)&p->a
b0d0: 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20  Op[p->nOp];     
b0e0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c    /* Memory aval
b0f0: 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  iable for alloca
b100: 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d  tion */.  zEnd =
b110: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d   (u8*)&p->aOp[p-
b120: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
b130: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
b140: 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f  end of zCsr[] */
b150: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
b160: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
b170: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
b180: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
b190: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
b1a0: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
b1b0: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
b1c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
b1d0: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
b1e0: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d  em = 10;.  }.  m
b1f0: 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a  emset(zCsr, 0, z
b200: 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73  End-zCsr);.  zCs
b210: 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38  r += (zCsr - (u8
b220: 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74  *)0)&7;.  assert
b230: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
b240: 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a  GNMENT(zCsr) );.
b250: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
b260: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
b270: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
b280: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
b290: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
b2a0: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20  ted in two.  ** 
b2b0: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
b2c0: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
b2d0: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
b2e0: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
b2f0: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
b300: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
b310: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
b320: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
b330: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
b340: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
b350: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
b360: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
b370: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
b380: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
b390: 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67  n the rest using
b3a0: 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74   a fresh allocat
b3b0: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
b3c0: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
b3d0: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
b3e0: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
b3f0: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
b400: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
b410: 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74  tover space at t
b420: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  he end of the op
b430: 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73  code array can s
b440: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
b450: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
b460: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
b470: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
b480: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
b490: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74  .  do {.    nByt
b4a0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  e = 0;.    p->aM
b4b0: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
b4c0: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
b4d0: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
b4e0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b4f0: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
b500: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61  llocSpace(p->aVa
b510: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
b520: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
b530: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b540: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
b550: 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e  pace(p->apArg, n
b560: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
b570: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
b580: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
b590: 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  zVar = allocSpac
b5a0: 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  e(p->azVar, nVar
b5b0: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
b5c0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b5d0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  yte);.    p->apC
b5e0: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
b5f0: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
b600: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
b610: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b640: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  Byte);.    p->aO
b650: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
b660: 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  pace(p->aOnceFla
b670: 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c  g, nOnce, &zCsr,
b680: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b690: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
b6a0: 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20  .      p->pFree 
b6b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b6c0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
b6d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72  ;.    }.    zCsr
b6e0: 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20   = p->pFree;.   
b6f0: 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42   zEnd = &zCsr[nB
b700: 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20  yte];.  }while( 
b710: 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61  nByte && !db->ma
b720: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
b730: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
b740: 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63  ursor;.  p->nOnc
b750: 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20  eFlag = nOnce;. 
b760: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a   if( p->aVar ){.
b770: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79      p->nVar = (y
b780: 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66  nVar)nVar;.    f
b790: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
b7a0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
b7b0: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
b7c0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70  EM_Null;.      p
b7d0: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
b7e0: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  b;.    }.  }.  i
b7f0: 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20  f( p->azVar ){. 
b800: 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50     p->nzVar = pP
b810: 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20  arse->nzVar;.   
b820: 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72   memcpy(p->azVar
b830: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
b840: 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66   p->nzVar*sizeof
b850: 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  (p->azVar[0]));.
b860: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73      memset(pPars
b870: 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61  e->azVar, 0, pPa
b880: 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  rse->nzVar*sizeo
b890: 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  f(pParse->azVar[
b8a0: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
b8b0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70  p->aMem ){.    p
b8c0: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8e0: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
b8f0: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
b900: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
b910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b920: 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66    /*       not f
b930: 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f  rom 0..nMem-1 */
b940: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c  .    for(n=1; n<
b950: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
b960: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
b970: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69  ags = MEM_Invali
b980: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  d;.      p->aMem
b990: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
b9a0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c   }.  }.  p->expl
b9b0: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
b9c0: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
b9d0: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
b9e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
b9f0: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
ba00: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
ba10: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
ba20: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
ba30: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
ba40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
ba50: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
ba60: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
ba70: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
ba80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
ba90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
baa0: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
bab0: 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20  db, pCx);.  if( 
bac0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
bad0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
bae0: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pCx->pBt);.   
baf0: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
bb00: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
bb10: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
bb20: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
bb30: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  by.    ** the ca
bb40: 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d  ll above. */.  }
bb50: 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43  else if( pCx->pC
bb60: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
bb70: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
bb80: 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f  rsor(pCx->pCurso
bb90: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
bba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
bbb0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
bbc0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20  Cx->pVtabCursor 
bbd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
bbe0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
bbf0: 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70  bCursor = pCx->p
bc00: 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20  VtabCursor;.    
bc10: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
bc20: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
bc30: 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  pCx->pModule;.  
bc40: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
bc50: 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75  d = 1;.    pModu
bc60: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
bc70: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e  Cursor);.    p->
bc80: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
bc90: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
bca0: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
bcb0: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
bcc0: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
bcd0: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
bce0: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
bcf0: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
bd00: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
bd10: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
bd20: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
bd30: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
bd40: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
bd50: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
bd60: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
bd70: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
bd80: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
bd90: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76  = pFrame->v;.  v
bda0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46  ->aOnceFlag = pF
bdb0: 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b  rame->aOnceFlag;
bdc0: 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  v->nOnceFlag 
bdd0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46  = pFrame->nOnceF
bde0: 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  lag;.  v->aOp = 
bdf0: 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
be00: 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
be10: 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
be20: 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
be30: 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
be40: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
be50: 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
be60: 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
be70: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
be80: 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
be90: 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
bea0: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
beb0: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
bec0: 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72  me->nChange;.  r
bed0: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
bee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
bef0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
bf00: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
bf10: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
bf20: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
bf30: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
bf40: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
bf50: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
bf60: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
bf70: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
bf80: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
bf90: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
bfa0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
bfb0: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
bfc0: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
bfd0: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
bfe0: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
bff0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
c000: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
c010: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
c020: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
c030: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
c040: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
c050: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
c060: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
c070: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
c080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c090: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
c0a0: 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rame);.  }.  p->
c0b0: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  pFrame = 0;.  p-
c0c0: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  >nFrame = 0;..  
c0d0: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
c0e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
c0f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
c100: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
c110: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
c120: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
c130: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
c140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c150: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
c160: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
c170: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
c180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c190: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
c1a0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
c1b0: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
c1c0: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
c1d0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
c1e0: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
c1f0: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
c200: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
c210: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
c220: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
c230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
c240: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
c250: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
c260: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
c270: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
c280: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73  by the VM */.  s
c290: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
c2a0: 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30  AuxData(p, -1, 0
c2b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
c2c0: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d  pAuxData==0 );.}
c2d0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
c2e0: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
c2f0: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
c300: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c310: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
c320: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
c330: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
c340: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
c350: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
c360: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
c370: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
c380: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
c390: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
c3a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c3b0: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
c3c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c3d0: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
c3e0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c3f0: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
c400: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
c410: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
c420: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
c430: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
c440: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
c450: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
c460: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
c470: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
c480: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
c490: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
c4a0: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
c4b0: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
c4c0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
c4d0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
c4e0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
c4f0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
c500: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c  flags==MEM_Inval
c510: 69 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  id );.  }.#endif
c520: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
c530: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
c540: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
c550: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
c560: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
c570: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
c580: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
c590: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
c5a0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
c5b0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
c5c0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
c5d0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
c5e0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
c5f0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
c600: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
c610: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
c620: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c630: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
c640: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
c650: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
c660: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
c670: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
c680: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c690: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
c6a0: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
c6b0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
c6c0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
c6d0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
c6e0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c6f0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
c700: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c710: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
c720: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
c730: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
c740: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c750: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
c760: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
c770: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
c780: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
c790: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
c7a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c7b0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
c7c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
c7d0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
c7e0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
c7f0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
c800: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
c810: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
c820: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
c830: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
c840: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
c850: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c860: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
c870: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
c880: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
c890: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
c8a0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
c8b0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
c8c0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
c8d0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
c8e0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
c8f0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
c900: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
c910: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
c920: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
c930: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
c940: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
c950: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
c960: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
c970: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
c980: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
c990: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
c9a0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
c9b0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
c9c0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
c9d0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
c9e0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
c9f0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ca00: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
ca10: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
ca40: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
ca50: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
ca80: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
ca90: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
caa0: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cac0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
cad0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
cae0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
caf0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
cb00: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
cb10: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
cb20: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
cb30: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
cb40: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
cb50: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
cb60: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
cb70: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
cb80: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
cb90: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
cba0: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
cbb0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
cbc0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
cbd0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
cbe0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
cbf0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
cc00: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
cc10: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
cc20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cc30: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
cc40: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
cc50: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
cc60: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
cc70: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
cc80: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
cc90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
cca0: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
ccb0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
ccc0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
ccd0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
cce0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
ccf0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
cd00: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
cd10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cd20: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
cd30: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
cd40: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
cd50: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
cd60: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
cd70: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
cd80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
cd90: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
cda0: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
cdb0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
cdc0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
cdd0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
cde0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
cdf0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
ce00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ce10: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
ce20: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
ce30: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
ce40: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
ce50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
ce60: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
ce70: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
ce80: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
ce90: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
cea0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
ceb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
cec0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
ced0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
cee0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
cef0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
cf00: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
cf10: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
cf20: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
cf30: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
cf40: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
cf50: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
cf60: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
cf70: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
cf80: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
cf90: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
cfa0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
cfb0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
cfc0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
cfd0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
cfe0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
cff0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
d000: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
d010: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
d020: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
d030: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d040: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
d050: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
d060: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
d070: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
d080: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
d090: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
d0a0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
d0b0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
d0c0: 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20  &p->zErrMsg);.. 
d0d0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
d0e0: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
d0f0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
d100: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
d110: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
d120: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
d130: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
d140: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
d150: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
d160: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
d170: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
d180: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
d190: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
d1a0: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
d1b0: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
d1c0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
d1d0: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
d1e0: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
d1f0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
d200: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
d210: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
d220: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d230: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d240: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
d250: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d260: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
d270: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
d280: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
d290: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
d2a0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
d2b0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
d2c0: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
d2d0: 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
d2e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d2f0: 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
d300: 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
d310: 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
d320: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
d330: 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
d340: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
d350: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d360: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d370: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d380: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
d390: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
d3a0: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
d3b0: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
d3c0: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
d3d0: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
d3e0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
d3f0: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
d400: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
d410: 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
d420: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
d430: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
d440: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a  INT_COMMITHOOK;.
d450: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
d460: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
d470: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
d480: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
d490: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
d4a0: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
d4b0: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
d4c0: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
d4d0: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
d4e0: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
d4f0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
d500: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
d510: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
d520: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
d530: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
d540: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
d550: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
d560: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
d570: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
d580: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
d590: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
d5a0: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
d5b0: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
d5c0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
d5d0: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
d5e0: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
d5f0: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
d600: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
d610: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
d620: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
d630: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
d640: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
d650: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
d660: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d670: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d680: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
d690: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d6a0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d6b0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d6c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d6d0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
d6e0: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
d6f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
d700: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
d710: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
d720: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
d730: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
d740: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
d750: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
d760: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
d770: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
d780: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
d790: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
d7a0: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
d7b0: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
d7c0: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
d7d0: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
d7e0: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
d7f0: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
d800: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d810: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d820: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
d830: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
d840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
d850: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
d860: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
d870: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
d880: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
d890: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d8a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
d8b0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
d8c0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d8d0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d8e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d8f0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
d900: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
d910: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
d920: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
d930: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
d940: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
d950: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
d960: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
d970: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d980: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
d990: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
d9a0: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
d9b0: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
d9c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d9d0: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
d9e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
d9f0: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
da00: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
da10: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
da20: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
da30: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
da40: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
da50: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
da60: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
da70: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
da80: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
da90: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
daa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
dab0: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
dac0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
dad0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
dae0: 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
daf0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
db00: 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
db10: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
db20: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
db30: 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
db40: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
db50: 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
db60: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
db70: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
db80: 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
db90: 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
dba0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
dbb0: 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
dbc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
dbd0: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
dbe0: 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69  iRandom;.      i
dbf0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b  f( retryCount ){
dc00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
dc10: 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20  ryCount>100 ){. 
dc20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dc30: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
dc40: 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73  , "MJ delete: %s
dc50: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
dc60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
dc70: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
dc80: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
dc90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dca0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74     }else if( ret
dcb0: 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20  ryCount==1 ){.  
dcc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
dcd0: 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
dce0: 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73   "MJ collide: %s
dcf0: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
dd00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dd10: 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b       retryCount+
dd20: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
dd30: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
dd40: 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
dd50: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71  andom);.      sq
dd60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
dd70: 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69  3, &zMaster[nMai
dd80: 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58  nFile], "-mj%06X
dd90: 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20  9%02X",.        
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e         (iRandom>
ddc0: 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52  >8)&0xffffff, iR
ddd0: 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20  andom&0xff);.   
dde0: 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65     /* The antipe
ddf0: 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63  nultimate charac
de00: 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65  ter of the maste
de10: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
de20: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
de30: 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d  "9" to avoid nam
de40: 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65  e collisions whe
de50: 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65  n using 8+3 file
de60: 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  names. */.      
de70: 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b  assert( zMaster[
de80: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
de90: 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27  zMaster)-3]=='9'
dea0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
deb0: 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61  3FileSuffix3(zMa
dec0: 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29  inFile, zMaster)
ded0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
dee0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
def0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
df00: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
df10: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
df20: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
df30: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
df40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
df50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
df60: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
df70: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
df80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
df90: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
dfa0: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
dfb0: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
dfc0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
dfd0: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
dfe0: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
dff0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
e000: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
e010: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
e020: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
e030: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
e040: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e050: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e060: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
e070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e080: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
e090: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
e0a0: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
e0b0: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
e0c0: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
e0d0: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
e0e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e0f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
e100: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
e110: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
e120: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
e130: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e140: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
e150: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
e160: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
e170: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
e180: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e190: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
e1a0: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
e1b0: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
e1c0: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
e1d0: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
e1e0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
e1f0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e200: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
e210: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e220: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
e230: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
e240: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
e250: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
e260: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
e270: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
e280: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
e290: 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
e2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
e2b0: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
e2c0: 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72   TEMP and :memor
e2d0: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
e2e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e2f0: 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b    assert( zFile[
e300: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]!=0 );.       
e310: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
e320: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
e330: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
e340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
e350: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
e360: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
e370: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
e380: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
e390: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
e3a0: 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
e3b0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
e3c0: 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
e3d0: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
e3e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
e3f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
e410: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
e420: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
e430: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
e440: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
e450: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e460: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
e470: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
e480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e4a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
e4b0: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
e4c0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
e4d0: 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
e4e0: 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
e4f0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
e500: 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
e510: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
e520: 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  ( needSync .    
e530: 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f   && 0==(sqlite3O
e540: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e550: 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
e560: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
e570: 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
e580: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
e590: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
e5a0: 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
e5b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
e5c0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
e5d0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
e5e0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
e5f0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
e600: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
e610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e620: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
e630: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e640: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
e650: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
e660: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
e670: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
e680: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
e690: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
e6a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e6b0: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
e6c0: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
e6d0: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
e6e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
e6f0: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
e700: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
e710: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
e720: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
e730: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
e740: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
e750: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
e760: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
e770: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
e780: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
e790: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
e7a0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
e7b0: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
e7c0: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
e7d0: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
e7e0: 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
e7f0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
e800: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
e810: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
e820: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
e830: 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
e840: 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
e850: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
e860: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
e870: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
e880: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
e890: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e8a0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e8b0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
e8c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e8d0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e8e0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
e8f0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
e900: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e910: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
e920: 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
e930: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
e940: 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
e950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e960: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e970: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
e980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e990: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e9a0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
e9b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
e9c0: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
e9d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
e9e0: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
e9f0: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
ea00: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
ea10: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
ea20: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
ea30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
ea40: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
ea50: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
ea60: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
ea70: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
ea80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
ea90: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
eaa0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
eab0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
eac0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
ead0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
eae0: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
eaf0: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
eb00: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
eb10: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
eb20: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
eb30: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
eb40: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
eb50: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
eb60: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
eb70: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
eb80: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
eb90: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
eba0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
ebb0: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
ebc0: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
ebd0: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
ebe0: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
ebf0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
ec00: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
ec10: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
ec20: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
ec30: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
ec40: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
ec50: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
ec60: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
ec70: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
ec80: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
ec90: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
eca0: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
ecb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
ecc0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
ecd0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ece0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
ecf0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
ed00: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
ed10: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
ed20: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
ed30: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
ed40: 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b  haseTwo(pBt, 1);
ed50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ed60: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
ed70: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
ed80: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
ed90: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
eda0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
edb0: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
edc0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
edd0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
ede0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
edf0: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
ee00: 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63  e3.nVdbeActive c
ee10: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
ee20: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
ee30: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
ee40: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
ee50: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
ee60: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
ee70: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
ee80: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
ee90: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
eea0: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
eeb0: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
eec0: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
eed0: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
eee0: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
eef0: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
ef00: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
ef10: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
ef20: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
ef30: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
ef40: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
ef50: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
ef60: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
ef70: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
ef80: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
ef90: 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20   0;.  int nRead 
efa0: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
efb0: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
efc0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
efd0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
efe0: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
eff0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
f000: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
f010: 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
f020: 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  te++;.      if( 
f030: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e  p->bIsReader ) n
f040: 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
f050: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
f060: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
f070: 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t==db->nVdbeActi
f080: 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ve );.  assert( 
f090: 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62  nWrite==db->nVdb
f0a0: 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65  eWrite );.  asse
f0b0: 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e  rt( nRead==db->n
f0c0: 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65  VdbeRead );.}.#e
f0d0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
f0e0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
f0f0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f100: 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
f110: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
f120: 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
f130: 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
f140: 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
f150: 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
f160: 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
f170: 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
f180: 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
f190: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f1a0: 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
f1b0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
f1c0: 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
f1d0: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
f1e0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
f1f0: 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
f200: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
f210: 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
f220: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
f230: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
f240: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
f250: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
f260: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
f270: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
f280: 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
f290: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
f2a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
f2b0: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
f2c0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
f2d0: 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
f2e0: 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
f2f0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
f300: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
f310: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
f320: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
f330: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
f340: 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
f350: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
f360: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
f370: 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
f380: 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
f390: 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
f3a0: 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
f3b0: 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
f3c0: 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
f3d0: 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
f3e0: 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
f3f0: 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
f400: 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
f410: 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
f420: 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
f430: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
f440: 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
f450: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
f460: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
f470: 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
f480: 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
f490: 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
f4a0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f4b0: 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
f4c0: 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
f4d0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
f4e0: 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
f4f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
f500: 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
f510: 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
f520: 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
f530: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
f540: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
f550: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
f560: 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
f570: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
f580: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
f590: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
f5a0: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f5b0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f5c0: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
f5d0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
f5e0: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
f5f0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
f600: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
f610: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f620: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
f630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f640: 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
f650: 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
f660: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f670: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
f680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f690: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f6a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f6b0: 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
f6c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f6d0: 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
f6e0: 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
f6f0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
f700: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f710: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
f720: 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
f730: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
f740: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f750: 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
f760: 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
f770: 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
f780: 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
f790: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f7a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f7b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
f7c0: 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
f7d0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
f7e0: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
f7f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f800: 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
f810: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
f820: 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
f830: 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
f840: 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
f850: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
f860: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
f870: 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
f880: 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
f890: 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
f8a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
f8b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
f8c0: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
f8d0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f8e0: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
f8f0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
f900: 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
f910: 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Cons;.      db->
f920: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
f930: 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
f940: 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
f950: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f960: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
f970: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
f980: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
f990: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
f9a0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
f9b0: 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
f9c0: 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
f9d0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
f9e0: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
f9f0: 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
fa00: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
fa10: 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
fa20: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
fa30: 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
fa40: 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
fa50: 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
fa60: 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
fa70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
fa80: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
fa90: 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
faa0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
fab0: 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
fac0: 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
fad0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
fae0: 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
faf0: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
fb00: 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
fb10: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
fb20: 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
fb30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
fb40: 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
fb50: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
fb60: 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
fb70: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
fb80: 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
fb90: 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
fba0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
fbb0: 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
fbc0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
fbd0: 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
fbe0: 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
fbf0: 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
fc00: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
fc10: 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
fc20: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
fc30: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
fc40: 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
fc50: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
fc60: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
fc70: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
fc80: 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67  Msg, db, "foreig
fc90: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
fca0: 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
fcb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
fcc0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
fcd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
fce0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
fcf0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
fd00: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
fd10: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
fd20: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
fd30: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
fd40: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
fd50: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
fd60: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
fd70: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
fd80: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
fd90: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
fda0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
fdb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fdc0: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
fdd0: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
fde0: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
fdf0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
fe00: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
fe10: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
fe20: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
fe30: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
fe40: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
fe50: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
fe60: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
fe70: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
fe80: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
fe90: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
fea0: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
feb0: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
fec0: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
fed0: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
fee0: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
fef0: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
ff00: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
ff10: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
ff20: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
ff30: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
ff40: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
ff50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
ff80: 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
ff90: 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
ffa0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
ffb0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
ffc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
ffd0: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
ffe0: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
fff0: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
10000 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
10010 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
10020 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
10030 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
10040 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
10050 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
10060 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
10070 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
10080 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
10090 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
100a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
100b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
100c0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
100d0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
100e0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
100f0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
10100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
10110 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
10120 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
10130 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
10140 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
10150 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
10160 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
10170 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10180 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
10190 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
101a0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
101b0 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
101c0 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
101d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
101e0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
101f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10200 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
10210 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
10220 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c    if( p->aOnceFl
10230 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61  ag ) memset(p->a
10240 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e  OnceFlag, 0, p->
10250 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c  nOnceFlag);.  cl
10260 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
10270 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
10280 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
10290 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
102a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
102b0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
102c0 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
102d0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
102e0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
102f0 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
10300 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
10310 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
10320 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
10330 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
10340 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
10350 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
10360 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
10370 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
10380 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
10390 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
103a0 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
103b0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
103c0 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
103d0 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
103e0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
103f0 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
10400 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
10410 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
10420 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
10430 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
10440 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
10450 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
10460 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
10470 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
10480 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
10490 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  rc & 0xff;.    a
104a0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
104b0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
104c0 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65  ED );  /* This e
104d0 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65  rror no longer e
104e0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53  xists */.    isS
104f0 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
10500 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
10510 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
10520 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
10530 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
10540 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
10550 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
10560 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
10570 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
10580 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10590 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
105a0 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
105b0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
105c0 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
105d0 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
105e0 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
105f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
10600 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
10610 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
10620 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
10630 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
10640 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
10650 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
10660 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
10670 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
10680 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
10690 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
106a0 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
106b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
106c0 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
106d0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
106e0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
106f0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
10700 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
10710 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68    ** occurred wh
10720 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
10730 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
10740 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
10750 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
10760 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
10770 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
10780 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
10790 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
107a0 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
107b0 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
107c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
107d0 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
107e0 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
107f0 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
10800 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
10810 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
10820 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
10830 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
10840 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
10850 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
10860 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
10870 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
10880 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
10890 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
108a0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
108b0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
108c0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
108d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
108e0 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
108f0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
10900 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
10910 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
10920 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
10930 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
10940 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
10950 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
10960 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
10970 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
10980 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10990 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
109a0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
109b0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
109c0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
109d0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
109e0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
109f0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
10a00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10a10 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
10a20 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
10a30 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
10a40 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
10a50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10a60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10a70 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
10a80 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
10a90 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
10aa0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
10ab0 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
10ac0 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
10ad0 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
10ae0 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
10af0 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
10b00 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
10b10 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
10b20 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
10b30 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
10b40 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
10b50 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
10b60 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
10b70 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
10b80 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
10b90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10ba0 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
10bb0 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
10bc0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
10bd0 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62       && db->nVdb
10be0 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64  eWrite==(p->read
10bf0 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
10c00 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
10c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
10c20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
10c30 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
10c40 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
10c50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10c60 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
10c70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
10c80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
10ca0 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
10cb0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
10cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
10cd0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
10ce0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10cf0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
10d00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
10d10 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
10d20 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
10d30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10d40 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
10d50 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
10d60 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
10d70 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
10d80 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
10d90 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
10da0 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
10db0 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
10dc0 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
10dd0 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
10de0 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
10df0 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
10e00 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
10e10 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
10e20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
10e30 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
10e40 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
10e50 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
10e60 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
10e70 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
10e80 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
10e90 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
10ea0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10eb0 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
10ec0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10ed0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
10ee0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10f00 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
10f10 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
10f20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10f30 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
10f40 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  K);.        }els
10f50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
10f60 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
10f70 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
10f80 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
10f90 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
10fa0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
10fb0 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
10fc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10fd0 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
10fe0 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
10ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
11000 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
11010 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
11020 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
11030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
11040 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
11050 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
11060 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
11070 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
11080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11090 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
110a0 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
110b0 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
110c0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
110d0 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
110e0 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
110f0 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
11100 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
11110 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
11120 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
11130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11140 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
11150 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
11160 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
11170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
11180 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
11190 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
111a0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
111b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
111c0 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
111d0 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
111e0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
111f0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
11200 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
11210 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
11220 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
11230 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
11240 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
11250 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
11260 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
11270 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
11280 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
11290 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
112a0 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
112b0 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
112c0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
112d0 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
112e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
112f0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
11300 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
11310 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
11320 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
11330 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
11340 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
11350 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
11360 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
11370 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
11380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11390 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
113a0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
113b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
113c0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
113d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
113e0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
113f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
11400 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
11410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
11420 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
11430 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
11440 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
11450 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
11460 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
11470 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
11480 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
11490 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
114a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
114b0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
114c0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
114d0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
114e0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
114f0 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
11500 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
11510 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11520 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
11530 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
11540 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
11550 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
11560 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
11570 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
11580 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
11590 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
115a0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
115b0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
115c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
115d0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
115e0 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
115f0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
11600 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
11610 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
11620 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
11630 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
11640 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
11650 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
11660 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
11670 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
11680 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
11690 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
116a0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
116b0 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
116c0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
116d0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
116e0 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
116f0 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
11700 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
11710 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
11720 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
11730 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
11740 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
11750 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
11760 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
11770 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
11780 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
11790 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
117a0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
117b0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
117c0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
117d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
117e0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
117f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
11800 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
11810 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
11820 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
11830 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
11840 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
11850 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
11860 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
11870 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
11880 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
11890 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
118a0 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
118b0 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
118c0 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
118d0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
118e0 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
118f0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
11900 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
11910 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
11920 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
11930 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
11940 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
11950 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
11960 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
11970 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
11980 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
11990 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
119a0 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
119b0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
119c0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
119d0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
119e0 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
119f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
11a00 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
11a10 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
11a20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11a30 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
11a40 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
11a50 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
11a60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
11a70 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11a80 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
11a90 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
11aa0 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
11ab0 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
11ac0 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
11ad0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
11ae0 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
11af0 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
11b00 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
11b10 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
11b20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
11b30 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
11b40 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
11b50 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
11b60 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
11b70 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
11b80 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
11b90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
11ba0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
11bb0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
11bc0 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
11bd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11be0 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
11bf0 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
11c00 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
11c10 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
11c20 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
11c30 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
11c40 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
11c50 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
11c60 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
11c70 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
11c80 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
11c90 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
11ca0 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
11cb0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
11cc0 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  ();.    db->mall
11cd0 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
11ce0 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d  cFailed;.    db-
11cf0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
11d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
11d10 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
11d20 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
11d30 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
11d40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
11d50 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
11d60 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
11d70 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
11d80 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
11d90 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
11da0 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
11db0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11dc0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
11dd0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
11de0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
11df0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
11e00 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
11e10 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
11e20 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
11e30 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
11e40 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
11e50 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
11e60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
11e70 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
11e80 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
11e90 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
11ea0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
11eb0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
11ec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
11ed0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
11ee0 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
11ef0 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
11f00 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
11f10 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
11f20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
11f30 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
11f40 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
11f50 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
11f60 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
11f70 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
11f80 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
11f90 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
11fa0 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
11fb0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
11fc0 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
11fd0 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
11fe0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
11ff0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
12000 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
12010 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
12020 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
12030 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
12040 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
12050 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
12060 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
12070 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
12080 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
12090 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
120a0 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
120b0 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
120c0 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
120d0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
120e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
120f0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
12100 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
12110 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
12120 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
12130 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
12140 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
12150 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
12160 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
12170 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
12180 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
12190 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
121a0 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
121b0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
121c0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
121d0 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
121e0 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
121f0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
12200 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
12210 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
12220 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
12230 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
12240 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12250 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
12260 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
12270 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
12280 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
12290 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
122a0 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
122b0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
122c0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
122d0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
122e0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
122f0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
12300 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
12310 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
12320 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
12330 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
12340 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
12350 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12360 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
12370 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
12380 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
12390 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
123a0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
123b0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
123c0 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
123d0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
123e0 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
123f0 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
12400 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
12410 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
12420 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
12430 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
12440 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
12450 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
12460 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
12470 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
12480 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
12490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
124a0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
124b0 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >rc, 0);.    sql
124c0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
124d0 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
124e0 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
124f0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52  _UTF8, SQLITE_TR
12500 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
12510 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12520 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
12530 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
12540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
12550 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
12560 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
12570 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
12580 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
12590 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
125a0 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
125b0 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
125c0 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
125d0 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
125e0 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
125f0 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
12600 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
12610 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
12620 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
12630 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
12640 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
12650 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
12660 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
12670 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
12680 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
12690 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
126a0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
126b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
126c0 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
126d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
126e0 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38  , "%6d %10lld %8
126f0 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  lld ",.         
12700 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
12710 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
12720 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
12730 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
12740 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
12750 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
12760 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
12770 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
12780 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
12790 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
127a0 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
127b0 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
127c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
127d0 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ndif.  p->magic 
127e0 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
127f0 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  T;.  return p->r
12800 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
12810 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
12820 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
12830 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
12840 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
12850 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
12860 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
12870 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
12880 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
12890 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
128a0 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
128b0 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
128c0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
128d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
128e0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
128f0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
12900 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
12910 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
12920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12930 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
12940 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
12950 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
12960 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rc );.  }.  sqli
12970 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
12980 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12990 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ../*.** If param
129a0 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73  eter iOp is less
129b0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
129c0 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
129d0 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c  ructor for.** al
129e0 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  l auxiliary data
129f0 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e   pointers curren
12a00 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68  tly cached by th
12a10 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a  e VM passed as.*
12a20 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
12a30 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ment..**.** Or, 
12a40 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65  if iOp is greate
12a50 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
12a60 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
12a70 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  e destructor is.
12a80 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  ** only invoked 
12a90 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69  for those auxili
12aa0 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
12ab0 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
12ac0 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69   user .** functi
12ad0 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  on invoked by th
12ae0 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70  e OP_Function op
12af0 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74  code at instruct
12b00 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56  ion iOp of .** V
12b10 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c  M pVdbe, and onl
12b20 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  y then if:.**.**
12b30 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69      * the associ
12b40 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61  ated function pa
12b50 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33  rameter is the 3
12b60 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f  2nd or later (co
12b70 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66  unting.**      f
12b80 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
12b90 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20  t), or.**.**    
12ba0 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
12bb0 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
12bc0 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61  ent mask is clea
12bd0 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72  r (where the fir
12be0 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74  st.**      funct
12bf0 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ion parameter co
12c00 72 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  rrsponds to bit 
12c10 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
12c20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12c30 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a  teAuxData(Vdbe *
12c40 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20  pVdbe, int iOp, 
12c50 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78  int mask){.  Aux
12c60 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64  Data **pp = &pVd
12c70 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  be->pAuxData;.  
12c80 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
12c90 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
12ca0 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
12cb0 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
12cc0 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
12cd0 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
12ce0 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 28 28 75   || !(mask & ((u
12cf0 33 32 29 31 3c 3c 70 41 75 78 2d 3e 69 41 72 67  32)1<<pAux->iArg
12d00 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
12d10 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
12d20 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
12d30 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
12d40 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
12d50 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41  }.      *pp = pA
12d60 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ux->pNext;.     
12d70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
12d80 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b  Vdbe->db, pAux);
12d90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12da0 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65    pp= &pAux->pNe
12db0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
12dc0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
12dd0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
12de0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20  d with the Vdbe 
12df0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
12e00 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
12e10 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a  * except for obj
12e20 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63  ect itself, whic
12e30 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a  h is preserved..
12e40 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
12e50 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
12e60 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
12e70 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
12e80 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
12e90 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
12ea0 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
12eb0 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
12ec0 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
12ed0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
12ee0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12ef0 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f   and frees the o
12f00 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f  bject itself..*/
12f10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
12f20 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c  eClearObject(sql
12f30 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
12f40 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
12f50 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
12f60 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
12f70 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
12f80 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
12f90 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
12fa0 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
12fb0 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
12fc0 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
12fd0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
12fe0 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28  LNAME_N);.  for(
12ff0 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d  pSub=p->pProgram
13000 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65  ; pSub; pSub=pNe
13010 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
13020 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSub->pNext;.  
13030 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
13040 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c  y(db, pSub->aOp,
13050 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20   pSub->nOp);.   
13060 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13070 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20  b, pSub);.  }.  
13080 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31  for(i=p->nzVar-1
13090 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c  ; i>=0; i--) sql
130a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
130b0 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76  ->azVar[i]);.  v
130c0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
130d0 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
130e0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
130f0 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65  ree(db, p->aLabe
13100 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
13110 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
13120 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
13130 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
13140 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
13150 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
13160 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
13170 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
13180 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c  E_EXPLAIN).  sql
13190 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
131a0 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73  ->zExplain);.  s
131b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
131c0 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23   p->pExplain);.#
131d0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
131e0 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
131f0 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
13200 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
13210 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
13220 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
13230 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
13240 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
13250 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
13260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13270 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
13280 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
13290 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
132a0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
132b0 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
132c0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
132d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
132e0 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
132f0 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
13300 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
13310 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
13320 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
13330 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
13340 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
13350 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
13360 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
13370 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
13380 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
13390 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
133a0 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
133b0 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
133c0 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
133d0 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
133e0 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
133f0 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
13400 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
13410 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
13420 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
13430 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
13440 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
13450 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
13460 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
13470 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
13480 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
13490 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
134a0 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
134b0 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
134c0 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
134d0 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
134e0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
134f0 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
13500 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
13510 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
13520 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
13530 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
13540 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
13550 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
13560 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
13570 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
13580 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
13590 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
135a0 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
135b0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
135c0 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
135d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
135e0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
135f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
13600 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
13610 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
13620 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
13630 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72  {.    int res, r
13640 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
13650 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e  _TEST.    extern
13660 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
13670 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
13680 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
13690 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
136a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
136b0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
136c0 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
136d0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
136e0 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66  0, &res);.    if
136f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13700 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77  ;.    p->lastRow
13710 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  id = p->movetoTa
13720 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65  rget;.    if( re
13730 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  s!=0 ) return SQ
13740 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
13750 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  T;.    p->rowidI
13760 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64  sValid = 1;.#ifd
13770 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
13780 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
13790 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
137a0 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65  f.    p->deferre
137b0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
137c0 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
137d0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
137e0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
137f0 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  S(p->pCursor) ){
13800 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65  .    int hasMove
13810 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
13820 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
13830 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
13840 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64  ursor, &hasMoved
13850 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
13860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
13870 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20  f( hasMoved ){. 
13880 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61       p->cacheSta
13890 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
138a0 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c  E;.      p->null
138b0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Row = 1;.    }. 
138c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
138d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
138e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
138f0 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
13900 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
13910 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
13920 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
13930 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
13940 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
13950 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
13960 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
13970 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
13980 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
13990 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
139a0 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
139b0 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
139c0 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
139d0 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
139e0 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
139f0 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
13a00 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
13a10 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
13a20 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
13a30 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
13a40 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
13a50 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
13a60 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
13a70 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
13a80 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
13a90 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
13aa0 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
13ab0 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
13ac0 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
13ad0 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
13ae0 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
13af0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
13b00 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
13b10 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
13b20 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
13b30 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
13b40 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
13b50 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
13b60 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
13b70 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
13b80 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
13b90 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
13ba0 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
13bb0 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a   separately..**.
13bc0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
13bd0 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
13be0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
13bf0 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
13c00 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
13c10 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
13c20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
13c30 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
13c50 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
13c60 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
13c70 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13ca0 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
13cd0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13ce0 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
13d00 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13d10 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13d20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
13d30 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
13d40 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
13d50 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
13d80 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
13d90 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
13da0 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
13db0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
13dc0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
13df0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13e00 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
13e20 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
13e30 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
13e60 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
13e70 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13ea0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
13eb0 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13ee0 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
13ef0 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
13f00 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
13f10 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
13f20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
13f30 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
13f40 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
13f50 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
13f60 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
13f70 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
13f80 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
13f90 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
13fa0 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
13fb0 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
13fc0 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
13fd0 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
13fe0 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
13ff0 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
14000 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
14010 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
14020 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14030 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
14040 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
14050 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
14060 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
14070 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
14080 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
14090 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
140a0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
140b0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
140c0 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
140d0 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
140e0 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
140f0 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
14100 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
14110 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
14120 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
14130 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
14140 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29  u;.    if( i<0 )
14150 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28 2d  {.      if( i<(-
14160 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65 74  MAX_6BYTE) ) ret
14170 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 6;.      /* 
14180 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70 72  Previous test pr
14190 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d  events:  u = -(-
141a0 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
141b0 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75 20  808) */.      u 
141c0 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -i;.    }else{
141d0 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20  .      u = i;.  
141e0 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31    }.    if( u<=1
141f0 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  27 ){.      retu
14200 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26 26 20  rn ((i&1)==i && 
14210 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20  file_format>=4) 
14220 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a  ? 8+(u32)u : 1;.
14230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
14240 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20  =32767 ) return 
14250 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33  2;.    if( u<=83
14260 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33  88607 ) return 3
14270 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  ;.    if( u<=214
14280 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e  7483647 ) return
14290 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d   4;.    if( u<=M
142a0 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72  AX_6BYTE ) retur
142b0 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 5;.    return 
142c0 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
142d0 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
142e0 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
142f0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
14300 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
14310 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f  d || flags&(MEM_
14320 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b  Str|MEM_Blob) );
14330 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a  .  n = pMem->n;.
14340 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
14350 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
14360 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
14370 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14380 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  n>=0 );.  return
14390 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
143a0 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
143b0 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  =0));.}../*.** R
143c0 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
143d0 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
143e0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
143f0 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
14400 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
14410 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14420 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
14430 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
14440 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
14450 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
14460 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
14470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14480 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
14490 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c  Size[] = { 0, 1,
144a0 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20   2, 3, 4, 6, 8, 
144b0 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  8, 0, 0, 0, 0 };
144c0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a  .    return aSiz
144d0 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  e[serial_type];.
144e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
144f0 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
14500 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
14510 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
14520 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
14530 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
14540 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
14550 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
14560 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
14570 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
14580 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
14590 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
145a0 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
145b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
145c0 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
145d0 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
145e0 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
145f0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
14600 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
14610 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
14620 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
14630 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
14640 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
14650 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
14660 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
14670 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
14680 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
14690 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
146a0 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
146b0 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
146c0 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
146d0 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
146e0 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
146f0 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
14700 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
14710 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
14720 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
14730 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
14740 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
14750 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
14760 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
14770 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
14780 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
14790 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
147a0 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
147b0 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
147c0 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
147d0 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
147e0 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
147f0 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
14800 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
14810 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
14820 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
14830 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
14840 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
14850 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
14860 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
14870 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
14880 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
14890 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
148a0 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
148b0 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
148c0 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
148d0 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
148e0 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
148f0 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
14900 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
14910 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
14920 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
14930 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
14940 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
14950 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
14960 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
14970 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
14980 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
14990 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
149a0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
149b0 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
149c0 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
149d0 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
149e0 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
149f0 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
14a00 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
14a10 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
14a20 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
14a30 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
14a40 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
14a50 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
14a60 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
14a70 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
14a80 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
14a90 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
14aa0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
14ab0 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
14ac0 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
14ad0 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
14ae0 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
14af0 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
14b00 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
14b10 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
14b20 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
14b30 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
14b40 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
14b50 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
14b60 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
14b70 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14b80 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
14b90 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
14ba0 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
14bb0 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
14bc0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
14bd0 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
14be0 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
14bf0 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
14c00 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
14c10 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
14c20 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
14c30 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
14c40 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
14c50 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
14c60 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
14c70 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
14c80 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
14c90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
14ca0 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
14cb0 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
14cc0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
14cd0 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
14ce0 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
14cf0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
14d00 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
14d10 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
14d20 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
14d30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14d40 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
14d50 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
14d60 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
14d70 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e  eft in buf[].  n
14d80 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20  Buf must always 
14d90 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75  be.** large enou
14da0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  gh to hold the e
14db0 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78  ntire field.  Ex
14dc0 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65  cept, if the fie
14dd0 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20  ld is.** a blob 
14de0 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c  with a zero-fill
14df0 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75  ed tail, then bu
14e00 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73  f[] might be jus
14e10 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73  t the right.** s
14e20 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72  ize to hold ever
14e30 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f  ything except fo
14e40 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  r the zero-fille
14e50 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b  d tail.  If buf[
14e60 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67  ].** is only big
14e70 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
14e80 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65  the non-zero pre
14e90 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77  fix, then only w
14ea0 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65  rite that.** pre
14eb0 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  fix into buf[]. 
14ec0 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73   But if buf[] is
14ed0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
14ee0 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a   hold both the.*
14ef0 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65  * prefix and the
14f00 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65   tail then write
14f10 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20   the prefix and 
14f20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20  set the tail to 
14f30 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a  all.** zeros..**
14f40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
14f50 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
14f60 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
14f70 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65  into buf[].  The
14f80 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79   number.** of by
14f90 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d  tes in the zero-
14fa0 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69  filled tail is i
14fb0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
14fc0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79  eturn value only
14fd0 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74  .** if those byt
14fe0 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69  es were zeroed i
14ff0 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32  n buf[]..*/ .u32
15000 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15010 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69  alPut(u8 *buf, i
15020 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d  nt nBuf, Mem *pM
15030 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
15040 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69  mat){.  u32 seri
15050 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
15060 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
15070 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61  pMem, file_forma
15080 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a  t);.  u32 len;..
15090 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
150a0 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
150b0 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
150c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
150d0 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
150e0 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20   u32 i;.    if( 
150f0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
15100 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15110 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
15120 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20  f(pMem->r) );.  
15130 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26      memcpy(&v, &
15140 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28  pMem->r, sizeof(
15150 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
15160 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
15170 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
15180 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
15190 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
151a0 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
151b0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
151c0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
151d0 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d     assert( len<=
151e0 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20 20  (u32)nBuf );.   
151f0 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20   while( i-- ){. 
15200 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75       buf[i] = (u
15210 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
15220 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
15230 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
15240 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
15250 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
15260 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
15270 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
15280 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
15290 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
152a0 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
152b0 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
152c0 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
152d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
152e0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
152f0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
15300 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29   pMem->n<=nBuf )
15310 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
15320 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ->n;.    memcpy(
15330 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
15340 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d  n);.    if( pMem
15350 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
15360 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20  ro ){.      len 
15370 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
15380 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15390 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20  nBuf>=0 );.     
153a0 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32 29   if( len > (u32)
153b0 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
153c0 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66 3b  len = (u32)nBuf;
153d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
153e0 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
153f0 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
15400 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
15410 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
15420 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
15430 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
15440 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
15450 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
15460 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
15470 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
15480 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
15490 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
154a0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
154b0 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
154c0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
154d0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
154e0 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
154f0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
15500 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
15510 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
15520 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
15530 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
15540 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
15550 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15560 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
15570 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
15580 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
155b0 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
155c0 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
155d0 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
155e0 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
155f0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
15600 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
15610 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
15620 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
15630 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
15640 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
15650 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
15660 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
15670 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
15680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15690 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
156a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
156b0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
156c0 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
156d0 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
156e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
156f0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
15700 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
15710 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
15720 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
15730 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
15740 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
15750 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
15760 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
15770 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15780 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
15790 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
157a0 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
157b0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
157c0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
157d0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
157e0 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
157f0 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
15800 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
15810 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15820 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
15830 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
15840 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
15850 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
15860 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
15870 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
15880 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
15890 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
158a0 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
158b0 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
158c0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
158d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
158e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
158f0 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
15900 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
15910 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
15920 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
15930 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
15940 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
15950 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
15960 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
15970 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
15980 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
15990 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
159a0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
159b0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
159c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
159d0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
159e0 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
159f0 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
15a00 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
15a10 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
15a20 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
15a30 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
15a40 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
15a50 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
15a60 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
15a70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15a80 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
15a90 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
15aa0 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
15ab0 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
15ac0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
15ad0 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
15ae0 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
15af0 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
15b00 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
15b10 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
15b20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
15b30 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
15b40 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
15b50 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
15b60 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
15b70 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
15b80 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
15b90 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
15ba0 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
15bb0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
15bc0 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
15bd0 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32  .0;.      u64 t2
15be0 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61   = t1;.      swa
15bf0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
15c00 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(t2);.      ass
15c10 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
15c20 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
15c30 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
15c40 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
15c50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
15c60 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
15c70 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
15c80 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
15c90 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
15ca0 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
15cb0 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
15cc0 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
15cd0 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
15ce0 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
15cf0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
15d00 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
15d10 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
15d20 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
15d30 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15d40 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
15d50 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
15d60 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
15d70 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
15d80 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
15d90 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
15da0 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
15db0 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
15dc0 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
15dd0 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
15de0 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
15df0 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20  3IsNaN(pMem->r) 
15e00 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
15e10 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Real;.      }. 
15e20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20       return 8;. 
15e30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
15e40 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
15e50 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
15e60 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
15e70 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15e80 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
15e90 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
15ea0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
15eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
15ec0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
15ed0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20  lt: {.      u32 
15ee0 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  len = (serial_ty
15ef0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
15f00 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
15f10 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
15f20 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  m->n = len;.    
15f30 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30    pMem->xDel = 0
15f40 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
15f50 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a  al_type&0x01 ){.
15f60 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
15f70 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20  ags = MEM_Str | 
15f80 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
15f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15fa0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15fb0 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68  M_Blob | MEM_Eph
15fc0 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
15fd0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
15fe0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15ff0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
16000 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
16010 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75  d to allocate su
16020 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66  fficient space f
16030 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65  or an UnpackedRe
16040 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72  cord.** structur
16050 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  e large enough t
16060 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73  o be used with s
16070 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
16080 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74  Unpack() if.** t
16090 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
160a0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
160b0 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  o KeyInfo struct
160c0 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a  ure pKeyInfo..**
160d0 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73  .** The space is
160e0 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65   either allocate
160f0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
16100 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20  bMallocRaw() or 
16110 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74  from within.** t
16120 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66  he unaligned buf
16130 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74  fer passed via t
16140 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68  he second and th
16150 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70  ird arguments (p
16160 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61  resumably.** sta
16170 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68  ck space). If th
16180 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a  e former, then *
16190 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
161a0 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20   a pointer that 
161b0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65  should.** be eve
161c0 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79  ntually freed by
161d0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
161e0 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
161f0 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a  ). Or, if the .*
16200 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d  * allocation com
16210 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61  es from the pSpa
16220 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65  ce/szSpace buffe
16230 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  r, *ppFree is se
16240 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66  t to NULL.** bef
16250 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
16260 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
16270 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
16280 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
16290 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  /.UnpackedRecord
162a0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c   *sqlite3VdbeAll
162b0 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
162c0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
162d0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
162e0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
162f0 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  on of the record
16300 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
16310 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
16320 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e        /* Unalign
16330 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ed space availab
16340 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70  le */.  int szSp
16350 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
16360 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
16370 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
16380 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
16390 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20  *ppFree         
163a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
163b0 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  : Caller should 
163c0 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65  free this pointe
163d0 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b  r */.){.  Unpack
163e0 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20  edRecord *p;    
163f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70            /* Unp
16400 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20  acked record to 
16410 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
16420 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  nOff;           
16430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16440 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20  ncrement pSpace 
16450 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e  by nOff to align
16460 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79   it */.  int nBy
16470 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
16480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16490 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
164a0 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a  ired for *p */..
164b0 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20    /* We want to 
164c0 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65  shift the pointe
164d0 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68  r pSpace up such
164e0 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79   that it is 8-by
164f0 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a  te aligned..  **
16500 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74   Thus, we need t
16510 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61  o calculate a va
16520 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65  lue, nOff, betwe
16530 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73  en 0 and 7, to s
16540 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79  hift .  ** it by
16550 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20  .  If pSpace is 
16560 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61  already 8-byte a
16570 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f  ligned, nOff sho
16580 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a  uld be zero..  *
16590 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20  /.  nOff = (8 - 
165a0 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
165b0 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29  NT(pSpace) & 7))
165c0 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20   & 7;.  nByte = 
165d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
165e0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b  packedRecord)) +
165f0 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b   sizeof(Mem)*(pK
16600 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31  eyInfo->nField+1
16610 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73  );.  if( nByte>s
16620 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20  zSpace+nOff ){. 
16630 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
16640 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33  Record *)sqlite3
16650 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
16660 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
16670 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
16680 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69  (char *)p;.    i
16690 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
166a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
166b0 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
166c0 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66  rd*)&pSpace[nOff
166d0 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  ];.    *ppFree =
166e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d   0;.  }..  p->aM
166f0 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68  em = (Mem*)&((ch
16700 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69  ar*)p)[ROUND8(si
16710 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
16720 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  ord))];.  assert
16730 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
16740 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70  tOrder!=0 );.  p
16750 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
16760 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
16770 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
16780 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74  Field + 1;.  ret
16790 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
167a0 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
167b0 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
167c0 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
167d0 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  [], populate the
167e0 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63   .** UnpackedRec
167f0 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e  ord structure in
16800 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
16810 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77  ourth argument w
16820 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ith the.** conte
16830 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64  nts of the decod
16840 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76  ed record..*/ .v
16850 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
16860 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
16870 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16880 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
16890 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
168a0 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
168b0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
168c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
168d0 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
168e0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
168f0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
16900 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
16910 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61  record */.  Unpa
16920 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20  ckedRecord *p   
16930 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
16940 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65  his structure be
16950 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
16960 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
16970 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
16980 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
16990 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
169a0 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32  .  int d; .  u32
169b0 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169d0 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d  Offset in aKey[]
169e0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
169f0 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
16a20 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
16a30 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
16a40 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65  m *pMem = p->aMe
16a50 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d  m;..  p->flags =
16a60 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
16a70 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
16a80 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
16a90 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
16aa0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
16ab0 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
16ac0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
16ad0 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e  <szHdr && u<p->n
16ae0 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79  Field && d<=nKey
16af0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
16b00 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
16b10 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
16b20 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
16b30 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
16b40 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
16b50 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
16b60 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
16b70 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
16b80 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
16b90 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
16ba0 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
16bb0 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
16bc0 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
16bd0 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
16be0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16bf0 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
16c00 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
16c10 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
16c20 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
16c30 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
16c40 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
16c50 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
16c60 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  u;.}../*.** This
16c70 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
16c80 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
16c90 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
16ca0 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
16cb0 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
16cc0 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
16cd0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
16ce0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
16cf0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
16d00 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
16d10 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
16d20 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
16d30 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
16d40 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
16d50 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
16d60 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
16d70 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65   by th OP_MakeRe
16d80 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
16d90 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
16da0 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
16db0 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
16dc0 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
16dd0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
16de0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
16df0 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
16e00 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
16e10 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
16e20 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
16e30 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b  fields..** The k
16e40 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66 69  ey with fewer fi
16e50 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20  elds is usually 
16e60 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68  compares less th
16e70 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65  an the .** longe
16e80 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20  r key.  However 
16e90 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
16ea0 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e  INCRKEY flags in
16eb0 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a   pPKey2 is set.*
16ec0 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  * and the common
16ed0 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65 71   prefixes are eq
16ee0 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69  ual, then key1 i
16ef0 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32  s less than key2
16f00 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55  ..** Or if the U
16f10 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52  NPACKED_MATCH_PR
16f20 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65 74  EFIX flag is set
16f30 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78 65   and the prefixe
16f40 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20  s are.** equal, 
16f50 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72  then the keys ar
16f60 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
16f70 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20  be equal and.** 
16f80 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64  the parts beyond
16f90 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66   the common pref
16fa0 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ix are ignored..
16fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16fc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
16fd0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
16fe0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
16ff0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
17000 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
17010 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
17020 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
17030 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20  ){.  int d1;    
17040 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
17050 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
17060 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
17070 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
17080 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
17090 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
170a0 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
170b0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
170c0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
170d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
170e0 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
170f0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
17100 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
17110 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
17120 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17130 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
17140 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
17150 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
17160 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
17170 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
17180 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
17190 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
171a0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
171b0 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
171c0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
171d0 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
171e0 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
171f0 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
17200 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
17210 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
17220 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  Y( mem1.zMalloc 
17230 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
17240 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
17250 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
17260 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
17270 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
17280 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
17290 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
172a0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
172b0 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
172c0 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
172d0 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
172e0 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
172f0 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
17300 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
17310 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
17320 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
17330 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
17340 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
17350 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
17360 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
17370 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
17380 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
17390 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
173a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
173b0 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
173c0 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
173d0 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
173e0 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
173f0 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
17400 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
17410 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
17420 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
17430 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
17440 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
17450 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
17460 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
17470 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
17480 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
17490 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
174a0 7a 48 64 72 31 3b 0a 20 20 6e 46 69 65 6c 64 20  zHdr1;.  nField 
174b0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
174c0 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  ld;.  assert( pK
174d0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
174e0 65 72 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  er!=0 );.  while
174f0 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
17500 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
17510 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  d ){.    u32 ser
17520 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
17530 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
17540 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
17550 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
17560 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
17570 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
17580 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
17590 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
175a0 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e  );.    if( d1>=n
175b0 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56  Key1 && sqlite3V
175c0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
175d0 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30  (serial_type1)>0
175e0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
175f0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
17600 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
17610 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
17620 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
17630 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
17640 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
17650 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
17660 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
17670 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
17680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
17690 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
176a0 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
176b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e               i<n
176d0 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f  Field ? pKeyInfo
176e0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b  ->aColl[i] : 0);
176f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
17700 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17710 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
17720 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
17730 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20  nt below */..   
17740 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65     /* Invert the
17750 20 72 65 73 75 6c 74 20 69 66 20 77 65 20 61 72   result if we ar
17760 65 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f 72  e using DESC sor
17770 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
17780 20 20 69 66 28 20 69 3c 6e 46 69 65 6c 64 20 26    if( i<nField &
17790 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  & pKeyInfo->aSor
177a0 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
177b0 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
177c0 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20       }.    .    
177d0 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45 46    /* If the PREF
177e0 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 69  IX_SEARCH flag i
177f0 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66 69  s set and all fi
17800 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65 20  elds except the 
17810 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 72  final.      ** r
17820 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65 20  owid field were 
17830 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65 61  equal, then clea
17840 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41  r the PREFIX_SEA
17850 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65 74  RCH flag and set
17860 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65 79   .      ** pPKey
17870 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65 20  2->rowid to the 
17880 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77  value of the row
17890 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b 65  id field in (pKe
178a0 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20 20  y1, nKey1)..    
178b0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
178c0 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e  d by the OP_IsUn
178d0 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20 20  ique opcode..   
178e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
178f0 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26  (pPKey2->flags &
17900 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58   UNPACKED_PREFIX
17910 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d 28  _SEARCH) && i==(
17920 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d 31  pPKey2->nField-1
17930 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
17940 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64 72  ert( idx1==szHdr
17950 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20 20  1 && rc );.     
17960 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
17970 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
17980 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65 79  );.        pPKey
17990 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50  2->flags &= ~UNP
179a0 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41  ACKED_PREFIX_SEA
179b0 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50 4b  RCH;.        pPK
179c0 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 6d  ey2->rowid = mem
179d0 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20  1.u.i;.      }. 
179e0 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e     .      return
179f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
17a00 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ++;.  }..  /* No
17a10 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
17a20 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
17a30 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
17a40 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
17a50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
17a60 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
17a70 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
17a80 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
17a90 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
17aa0 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
17ab0 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
17ac0 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
17ad0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17ae0 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
17af0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
17b00 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
17b10 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
17b20 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
17b30 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
17b40 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
17b50 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
17b60 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e 50  qual. If the UNP
17b70 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20  ACKED_INCRKEY.  
17b80 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ** flag is set, 
17b90 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20 74  then break the t
17ba0 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20 6b  ie by treating k
17bb0 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a 20  ey2 as larger.. 
17bc0 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b   ** If the UPACK
17bd0 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20  ED_PREFIX_MATCH 
17be0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
17bf0 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d  n keys with comm
17c00 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a 2a  on prefixes.  **
17c10 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
17c20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74  to be equal.  Ot
17c30 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e  herwise, the lon
17c40 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a  ger key is the .
17c50 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41 73    ** larger.  As
17c60 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65   it happens, the
17c70 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c 77   pPKey2 will alw
17c80 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67 65  ays be the longe
17c90 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20  r.  ** if there 
17ca0 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 2e  is a difference.
17cb0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17cc0 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  rc==0 );.  if( p
17cd0 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
17ce0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
17cf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  ){.    rc = -1;.
17d00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65    }else if( pPKe
17d10 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
17d20 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
17d30 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 76  H ){.    /* Leav
17d40 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 6c  e rc==0 */.  }el
17d50 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64  se if( idx1<szHd
17d60 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  r1 ){.    rc = 1
17d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17d80 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43  c;.}. ../*.** pC
17d90 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
17da0 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
17db0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
17dc0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
17dd0 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
17de0 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
17df0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
17e00 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
17e10 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
17e20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17e30 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
17e40 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
17e50 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
17e60 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
17e70 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
17e80 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
17e90 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
17ea0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
17eb0 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
17ec0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
17ed0 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
17ee0 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
17ef0 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
17f00 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
17f10 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
17f20 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
17f30 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
17f40 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
17f50 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
17f60 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
17f70 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
17f80 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
17f90 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
17fa0 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
17fb0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
17fc0 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
17fd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
17fe0 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
17ff0 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  , v;..  UNUSED_P
18000 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a 20  ARAMETER(db);.. 
18010 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65   /* Get the size
18020 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
18030 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63  try.  Only indic
18040 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65  es entries of le
18050 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69  ss.  ** than 2Gi
18060 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20  B are support - 
18070 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d  anything large m
18080 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20  ust be database 
18090 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a  corruption..  **
180a0 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20   Any corruption 
180b0 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73  is detected in s
180c0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
180d0 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67  CellPtr(), thoug
180e0 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20  h, so.  ** this 
180f0 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20  code can safely 
18100 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c  assume that nCel
18110 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20  lKey is 32-bits 
18120 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
18130 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
18140 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
18150 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
18160 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
18170 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
18180 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
18190 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
181a0 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75  OK );     /* pCu
181b0 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
181c0 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
181d0 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73  not fail */.  as
181e0 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
181f0 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
18200 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
18210 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
18220 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
18230 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
18240 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d  dex entry */.  m
18250 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
18260 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20  eof(m));.  rc = 
18270 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
18280 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
18290 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
182a0 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
182b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
182c0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  c;.  }..  /* The
182d0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73   index entry mus
182e0 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68  t begin with a h
182f0 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20  eader size */.  
18300 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
18310 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64  2((u8*)m.z, szHd
18320 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  r);.  testcase( 
18330 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65  szHdr==3 );.  te
18340 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d  stcase( szHdr==m
18350 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  .n );.  if( unli
18360 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20  kely(szHdr<3 || 
18370 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20  (int)szHdr>m.n) 
18380 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
18390 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
183a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
183b0 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68  last field of th
183c0 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62  e index should b
183d0 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74  e an integer - t
183e0 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56  he ROWID..  ** V
183f0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c  erify that the l
18400 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79  ast entry really
18410 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   is an integer. 
18420 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
18430 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a  rint32((u8*)&m.z
18440 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52  [szHdr-1], typeR
18450 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
18460 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20  e( typeRowid==1 
18470 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
18480 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20  ypeRowid==2 );. 
18490 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
184a0 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73  owid==3 );.  tes
184b0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
184c0 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==4 );.  testcas
184d0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20  e( typeRowid==5 
184e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
184f0 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20  ypeRowid==6 );. 
18500 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
18510 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73  owid==8 );.  tes
18520 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
18530 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  ==9 );.  if( unl
18540 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c  ikely(typeRowid<
18550 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39  1 || typeRowid>9
18560 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37   || typeRowid==7
18570 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
18580 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
18590 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  on;.  }.  lenRow
185a0 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
185b0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79  SerialTypeLen(ty
185c0 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
185d0 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
185e0 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
185f0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
18600 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
18610 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
18620 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
18630 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
18640 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
18650 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
18660 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
18670 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
18680 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
18690 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
186a0 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
186b0 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
186c0 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
186d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
186e0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
186f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
18700 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
18710 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
18720 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
18730 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
18740 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
18750 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
18760 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
18770 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
18780 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
18790 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
187a0 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d  ase( m.zMalloc!=
187b0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
187c0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
187d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
187e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
187f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
18800 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
18810 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
18820 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
18830 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
18840 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
18850 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
18860 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
18870 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
18880 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
18890 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
188a0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
188b0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
188c0 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
188d0 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
188e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
188f0 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
18900 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
18910 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
18920 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
18930 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
18940 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
18950 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
18960 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
18970 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
18980 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
18990 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
189a0 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
189b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
189c0 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
189d0 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
189e0 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
189f0 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
18a00 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
18a10 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
18a20 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
18a30 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43  Compare(.  VdbeC
18a40 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
18a50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
18a60 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
18a70 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70  against */.  Unp
18a80 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e  ackedRecord *pUn
18a90 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61  packed,  /* Unpa
18aa0 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
18ab0 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  key to compare a
18ac0 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20  gainst */.  int 
18ad0 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
18ae0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18af0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
18b00 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
18b10 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
18b20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
18b30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
18b40 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
18b50 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
18b60 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
18b70 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
18b80 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ur) );.  VVA_ONL
18b90 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
18ba0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
18bb0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
18bc0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
18bd0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70  TE_OK );    /* p
18be0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
18bf0 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
18c00 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
18c10 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
18c20 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
18c30 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
18c40 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
18c50 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74  he say.  ** that
18c60 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
18c70 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
18c80 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
18c90 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
18ca0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
18cb0 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
18cc0 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
18cd0 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
18ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18cf0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
18d00 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73   memset(&m, 0, s
18d10 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20  izeof(m));.  rc 
18d20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
18d30 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43  FromBtree(pC->pC
18d40 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e  ursor, 0, (int)n
18d50 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
18d60 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
18d70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18d80 20 20 61 73 73 65 72 74 28 20 70 55 6e 70 61 63    assert( pUnpac
18d90 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ked->flags & UNP
18da0 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
18db0 43 48 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73  CH );.  *res = s
18dc0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
18dd0 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a  Compare(m.n, m.z
18de0 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  , pUnpacked);.  
18df0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
18e00 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
18e10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18e20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
18e30 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
18e40 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
18e50 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
18e60 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
18e70 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
18e80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
18e90 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
18ea0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18eb0 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
18ec0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
18ed0 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
18ee0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18ef0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
18f00 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
18f10 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
18f20 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
18f30 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
18f40 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
18f50 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
18f60 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
18f70 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
18f80 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
18f90 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
18fa0 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
18fb0 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
18fc0 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
18fd0 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
18fe0 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
18ff0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
19000 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
19010 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19020 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
19030 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
19040 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
19050 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
19060 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
19070 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
19080 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
19090 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
190a0 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
190b0 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
190c0 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
190d0 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
190e0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
190f0 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
19100 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
19110 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
19120 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
19130 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
19140 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
19150 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
19160 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
19170 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
19180 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
19190 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
191a0 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
191b0 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
191c0 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
191d0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
191e0 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
191f0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
19200 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
19210 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
19220 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
19230 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
19240 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
19250 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
19260 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
19270 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
19280 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
19290 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
192a0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
192b0 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
192c0 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
192d0 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
192e0 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
192f0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
19300 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
19310 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
19320 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
19330 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
19340 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
19350 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
19360 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
19370 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
19380 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
19390 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
193a0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
193b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
193c0 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
193d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
193e0 69 74 65 33 56 64 62 65 47 65 74 56 61 6c 75 65  ite3VdbeGetValue
193f0 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
19400 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
19410 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
19420 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
19430 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
19440 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
19450 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
19460 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
19470 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
19480 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
19490 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
194a0 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
194b0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
194c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
194d0 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
194e0 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
194f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
19500 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
19510 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
19520 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  F8);.        sql
19530 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65  ite3VdbeMemStore
19540 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74  Type((Mem *)pRet
19550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19560 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20   return pRet;.  
19570 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19580 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
19590 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61  figure SQL varia
195a0 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74  ble iVar so that
195b0 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76   binding a new v
195c0 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61  alue to it signa
195d0 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ls.** to sqlite3
195e0 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68  _reoptimize() th
195f0 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20  at re-preparing 
19600 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  the statement ma
19610 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
19620 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c   better query pl
19630 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  an..*/.void sqli
19640 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
19650 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  k(Vdbe *v, int i
19660 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Var){.  assert( 
19670 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
19680 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76  iVar>32 ){.    v
19690 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66  ->expmask = 0xff
196a0 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ffffff;.  }else{
196b0 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
196c0 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69  |= ((u32)1 << (i
196d0 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a     Var-1));.  }.}.