/ Hex Artifact Content
Login

Artifact 1633408f6dea06129441c5e2f22b2a5ce30fe97e:


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 56 44        case P4_VD
4340: 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  BEFUNC: {.      
4350: 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62    VdbeFunc *pVdb
4360: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
4370: 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  c *)p4;.        
4380: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
4390: 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46  ction(db, pVdbeF
43a0: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
43b0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
43c0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
43d0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
43e0: 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e  AuxData(pVdbeFun
43f0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  c, 0);.        s
4400: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4410: 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20   pVdbeFunc);.   
4420: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4430: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4440: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
4450: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
4460: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
4470: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
4480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4490: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
44a0: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
44b0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
44c0: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
44d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
44e0: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
44f0: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
4500: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4510: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
4520: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
4530: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4540: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
4550: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4560: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4570: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4590: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
45a0: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
45b0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
45c0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
45d0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
45e0: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
45f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4600: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4610: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
4620: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
4630: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
4640: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
4650: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
4660: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
4670: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
4680: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
4690: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
46a0: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
46b0: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
46c0: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
46d0: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
46e0: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
46f0: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
4700: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
4710: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
4720: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
4730: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72  pOp++){.      fr
4740: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4750: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4760: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4770: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
4780: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
4790: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
47a0: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
47b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
47c0: 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a  ree(db, aOp);.}.
47d0: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20  ./*.** Link the 
47e0: 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63  SubProgram objec
47f0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
4800: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4810: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a  into the linked.
4820: 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e  ** list at Vdbe.
4830: 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69  pSubProgram. Thi
4840: 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74  s list is used t
4850: 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62  o delete all sub
4860: 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65  -program.** obje
4870: 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20  cts when the VM 
4880: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  is no longer req
4890: 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  uired..*/.void s
48a0: 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75  qlite3VdbeLinkSu
48b0: 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70  bProgram(Vdbe *p
48c0: 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d  Vdbe, SubProgram
48d0: 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74   *p){.  p->pNext
48e0: 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72   = pVdbe->pProgr
48f0: 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72  am;.  pVdbe->pPr
4900: 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  ogram = p;.}../*
4910: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f  .** Change the o
4920: 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e  pcode at addr in
4930: 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f  to OP_Noop.*/.vo
4940: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4950: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
4960: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
4970: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
4980: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
4990: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
49a0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
49b0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65  = p->db;.    fre
49c0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
49d0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
49e0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c  .    memset(pOp,
49f0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
4a00: 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  ]));.    pOp->op
4a10: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
4a20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
4a30: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
4a40: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4a50: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
4a60: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
4a70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4a80: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
4a90: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
4aa0: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
4ab0: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
4ac0: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
4ad0: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
4ae0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
4af0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
4b00: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
4b10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
4b20: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
4b30: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
4b40: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
4b50: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
4b60: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
4b70: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4b80: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4b90: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
4ba0: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
4bb0: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
4bc0: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
4bd0: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
4be0: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
4bf0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
4c00: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
4c10: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
4c20: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
4c30: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
4c40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
4c50: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4c60: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
4c70: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
4c80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
4c90: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4ca0: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
4cb0: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
4cc0: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4cd0: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
4ce0: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
4cf0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
4d00: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
4d10: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
4d20: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
4d30: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
4d40: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
4d50: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
4d60: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4d70: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
4d80: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
4d90: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
4da0: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
4db0: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4dc0: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
4dd0: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
4de0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
4df0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
4e00: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
4e10: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
4e20: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
4e30: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
4e40: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
4e50: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
4e60: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
4e70: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
4e80: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
4e90: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
4ea0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
4eb0: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
4ec0: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
4ed0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
4ee0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
4ef0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4f00: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
4f10: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
4f20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
4f30: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
4f40: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
4f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
4f60: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
4f70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
4f80: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4f90: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
4fa0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
4fb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
4fc0: 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f 4b      if ( n!=P4_K
4fd0: 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34 5f  EYINFO && n!=P4_
4fe0: 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20 66  VTAB ) {.      f
4ff0: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
5000: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
5010: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
5020: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
5030: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
5040: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
5050: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
5060: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
5070: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
5080: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
5090: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73  aOp[addr];.  ass
50a0: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
50b0: 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 7c 7c 20  ==P4_NOTUSED || 
50c0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
50d0: 49 4e 54 33 32 20 29 3b 0a 20 20 66 72 65 65 50  INT32 );.  freeP
50e0: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
50f0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
5100: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
5110: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
5120: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
5130: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
5140: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
5150: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
5160: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
5170: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
5180: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
5190: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
51a0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
51b0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
51c0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
51d0: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
51e0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d   }else if( zP4==
51f0: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
5200: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  .p = 0;.    pOp-
5210: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
5220: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
5230: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n==P4_KEYINFO 
5240: 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
5250: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e  pKeyInfo;.    in
5260: 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b  t nField, nByte;
5270: 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28  ..    nField = (
5280: 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e  (KeyInfo*)zP4)->
5290: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74  nField;.    nByt
52a0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  e = sizeof(*pKey
52b0: 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d  Info) + (nField-
52c0: 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e  1)*sizeof(pKeyIn
52d0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20  fo->aColl[0]) + 
52e0: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79  nField;.    pKey
52f0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
5300: 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79  MallocRaw(0, nBy
5310: 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  te);.    pOp->p4
5320: 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  .pKeyInfo = pKey
5330: 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b  Info;.    if( pK
5340: 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
5350: 75 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a  u8 *aSortOrder;.
5360: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68        memcpy((ch
5370: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  ar*)pKeyInfo, zP
5380: 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c  4, nByte - nFiel
5390: 64 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f  d);.      aSortO
53a0: 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
53b0: 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  >aSortOrder;.   
53c0: 20 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74     assert( aSort
53d0: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
53e0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
53f0: 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e  tOrder = (unsign
5400: 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e  ed char*)&pKeyIn
5410: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64  fo->aColl[nField
5420: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
5430: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5440: 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72  rder, aSortOrder
5450: 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  , nField);.     
5460: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5470: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  4_KEYINFO;.    }
5480: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
5490: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
54a0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
54b0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
54c0: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
54d0: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
54e0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
54f0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5500: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
5510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5520: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73  _KEYINFO;.  }els
5530: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42  e if( n==P4_VTAB
5540: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5550: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5560: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5570: 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73  = P4_VTAB;.    s
5580: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
5590: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20  VTable *)zP4);. 
55a0: 20 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61     assert( ((VTa
55b0: 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d  ble *)zP4)->db==
55c0: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65  p->db );.  }else
55d0: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
55e0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
55f0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
5600: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
5610: 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73  d char)n;.  }els
5620: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
5630: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
5640: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
5650: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
5660: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
5670: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
5680: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5690: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
56a0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
56b0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
56c0: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
56d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
56e0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
56f0: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
5700: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
5710: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
5720: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
5730: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
5740: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
5750: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
5760: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
5770: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
5780: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
5790: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
57a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
57b0: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
57c0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
57d0: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
57e0: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
57f0: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
5800: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
5810: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
5820: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5830: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
5840: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5850: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
5860: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
5870: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
5880: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
5890: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
58a0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
58b0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
58c0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
58d0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
58e0: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
58f0: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
5900: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
5910: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
5920: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5930: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
5940: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
5950: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
5960: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
5970: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
5980: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
5990: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
59a0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
59b0: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
59c0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
59d0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
59e0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
59f0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
5a00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5a10: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
5a20: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
5a30: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
5a40: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
5a50: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
5a60: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5a70: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
5a80: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EBUG */../*.** R
5a90: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
5aa0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
5ab0: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
5ac0: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
5ad0: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
5ae0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
5af0: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
5b00: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
5b10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
5b20: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
5b30: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
5b40: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
5b50: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
5b60: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
5b70: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
5b80: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
5b90: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
5ba0: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
5bb0: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
5bc0: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
5bd0: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
5be0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
5bf0: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
5c00: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
5c10: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
5c20: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
5c30: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74   a OOM fault wit
5c40: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63  hout having to c
5c50: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
5c60: 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a  he return from .
5c70: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5c80: 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  is a valid point
5c90: 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  er.  But because
5ca0: 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64   the dummy.opcod
5cb0: 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79  e is 0,.** dummy
5cc0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77   will never be w
5cd0: 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73  ritten to.  This
5ce0: 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20   is verified by 
5cf0: 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20  code inspection 
5d00: 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e  and.** by runnin
5d10: 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e  g with Valgrind.
5d20: 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65  .**.** About the
5d30: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
5d40: 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d  MIT_TRACE:  Norm
5d50: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
5d60: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
5d70: 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e  ed.** unless p->
5d80: 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20  nOp>0.  This is 
5d90: 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20 61  because in the a
5da0: 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45  bsense of SQLITE
5db0: 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20  _OMIT_TRACE,.** 
5dc0: 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74  an OP_Trace inst
5dd0: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ruction is alway
5de0: 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73 71  s inserted by sq
5df0: 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20 61  lite3VdbeGet() a
5e00: 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e  s soon as.** a n
5e10: 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61 74  ew VDBE is creat
5e20: 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66  ed.  So we are f
5e30: 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72 20  ree to set addr 
5e40: 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68  to p->nOp-1 with
5e50: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
5e60: 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f   double-check to
5e70: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5e80: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
5e90: 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a  n-negative. But.
5ea0: 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** if SQLITE_OMI
5eb0: 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69 6e  T_TRACE is defin
5ec0: 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65  ed, the OP_Trace
5ed0: 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
5ee0: 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a  we do need to.**
5ef0: 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   check the value
5f00: 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66   of p->nOp-1 bef
5f10: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a  ore continuing..
5f20: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
5f30: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
5f40: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
5f50: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
5f60: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
5f70: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
5f80: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
5f90: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
5fa0: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
5fb0: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
5fc0: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
5fd0: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
5fe0: 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f  /.  static VdbeO
5ff0: 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e  p dummy;  /* Ign
6000: 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72  ore the MSVC war
6010: 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e  ning about no in
6020: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61  itializer */.  a
6030: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
6040: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
6050: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
6060: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
6070: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
6080: 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29   if( p->nOp==0 )
6090: 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a   return (VdbeOp*
60a0: 29 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a  )&dummy;.#endif.
60b0: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
60c0: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
60d0: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
60e0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
60f0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6100: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
6110: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6120: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
6130: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
6140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6150: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
6160: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  r];.  }.}..#if !
6170: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6180: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20  MIT_EXPLAIN) || 
6190: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
61a0: 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e   \.     || defin
61b0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
61c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
61d0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
61e0: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
61f0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
6200: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
6210: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
6220: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
6230: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
6240: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
6250: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
6260: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
6270: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
6280: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
6290: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
62a0: 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28  zTemp;.  assert(
62b0: 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20   nTemp>=20 );.  
62c0: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
62d0: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
62e0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
62f0: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  C:.    case P4_K
6300: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
6310: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
6320: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
6330: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
6340: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
6350: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
6360: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
6370: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6380: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6390: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
63a0: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
63b0: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
63c0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
63d0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
63e0: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
63f0: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
6400: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
6410: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
6420: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
6430: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
6440: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
6450: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
6460: 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69  "nil";.        i
6470: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
6480: 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20  rlen30(zColl);. 
6490: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
64a0: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
64b0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
64c0: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
64d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
64e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
64f0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6500: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ',';.        if(
6510: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
6520: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
6530: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6540: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
6550: 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  }.        memcpy
6560: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c  (&zTemp[i], zCol
6570: 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, n+1);.       
6580: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   i += n;.      }
6590: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b  .      zTemp[i++
65a0: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a  ] = ')';.      z
65b0: 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Temp[i] = 0;.   
65c0: 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65     assert( i<nTe
65d0: 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  mp );.      brea
65e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
65f0: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
6600: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6610: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
6620: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
6630: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6640: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c  mp, zTemp, "coll
6650: 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  seq(%.20s)", pCo
6660: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
6670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6680: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
6690: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
66a0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
66b0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
66c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
66d0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
66e0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
66f0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
6700: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
6710: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6720: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
6730: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6740: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6750: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
6760: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
6770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6780: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
6790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
67a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
67b0: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
67c0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
67d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
67e0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
67f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6800: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6810: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
6820: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
6830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6840: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
6850: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
6860: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
6870: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
6880: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
6890: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
68a0: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
68b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
68c0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
68d0: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
68e0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
68f0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6900: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
6910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6920: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
6930: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
6940: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6950: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6960: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
6970: 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r);.      }els
6980: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
6990: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
69a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
69b0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
69c0: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
69d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
69e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
69f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
6a00: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
6a10: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
6a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6a30: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
6a40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6a50: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
6a60: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
6a70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
6a80: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
6a90: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
6aa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6ab0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6ac0: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
6ad0: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
6ae0: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
6af0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
6b00: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
6b10: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
6b20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6b30: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6b40: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
6b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6b60: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
6b70: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
6b80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6b90: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6ba0: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
6bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6bc0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56  .    case P4_ADV
6bd0: 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54  ANCE: {.      zT
6be0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
6bf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6c00: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6c10: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
6c20: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
6c30: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
6c40: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
6c50: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
6c60: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6c70: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6c80: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
6c90: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
6ca0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
6cb0: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
6cc0: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
6cd0: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
6ce0: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
6cf0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
6d00: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
6d10: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
6d20: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
6d30: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
6d40: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
6d50: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
6d60: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
6d70: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
6d80: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
6d90: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
6da0: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
6db0: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
6dc0: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
6dd0: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
6de0: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
6df0: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
6e00: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
6e10: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
6e20: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
6e30: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
6e40: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
6e50: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
6e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
6e70: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
6e80: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
6e90: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20  p->btreeMask |= 
6ea0: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b  ((yDbMask)1)<<i;
6eb0: 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73  .  if( i!=1 && s
6ec0: 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61  qlite3BtreeShara
6ed0: 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ble(p->db->aDb[i
6ee0: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d  ].pBt) ){.    p-
6ef0: 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79  >lockMask |= ((y
6f00: 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  DbMask)1)<<i;.  
6f10: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
6f20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
6f30: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
6f40: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
6f50: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
6f60: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
6f70: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
6f80: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
6f90: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
6fa0: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6fb0: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
6fc0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
6fd0: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
6fe0: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
6ff0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
7000: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
7010: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
7020: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
7030: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
7040: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
7050: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
7060: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
7070: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
7080: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
7090: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
70a0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
70b0: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
70c0: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
70d0: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
70e0: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
70f0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
7100: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
7110: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
7120: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
7130: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
7140: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
7150: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
7160: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
7170: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
7180: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
7190: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
71a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
71b0: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
71c0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
71d0: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
71e0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
71f0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
7200: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
7210: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
7220: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
7230: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
7240: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
7250: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
7260: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
7270: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
7280: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
7290: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
72a0: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
72b0: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
72c0: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
72d0: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
72e0: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
72f0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
7300: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
7310: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
7320: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
7330: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
7340: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
7350: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
7360: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
7370: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7380: 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20   yDbMask mask;. 
7390: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
73a0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
73b0: 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63  Db;.  if( p->loc
73c0: 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72  kMask==0 ) retur
73d0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
73e0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
73f0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
7400: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
7410: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
7420: 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e  i=0, mask=1; i<n
7430: 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d  Db; i++, mask +=
7440: 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20   mask){.    if( 
7450: 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20  i!=1 && (mask & 
7460: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20  p->lockMask)!=0 
7470: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
7480: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
7490: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
74a0: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
74b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
74c0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
74d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
74e0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
74f0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7500: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
7510: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
7520: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
7530: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
7540: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
7550: 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r()..*/.void sql
7560: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
7570: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
7580: 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b  .  yDbMask mask;
7590: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
75a0: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
75b0: 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c   nDb;.  if( p->l
75c0: 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74  ockMask==0 ) ret
75d0: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
75e0: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
75f0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
7600: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
7610: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
7620: 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69  r(i=0, mask=1; i
7630: 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20  <nDb; i++, mask 
7640: 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66  += mask){.    if
7650: 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20  ( i!=1 && (mask 
7660: 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d  & p->lockMask)!=
7670: 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  0 && ALWAYS(aDb[
7680: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
7690: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
76a0: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
76b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
76c0: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
76d0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
76e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
76f0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
7700: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
7710: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
7720: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
7730: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
7740: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7750: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
7760: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
7770: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
7780: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
7790: 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63  tr[50];.  static
77a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
77b0: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
77c0: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
77d0: 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  -4s %.2X %s\n";.
77e0: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
77f0: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
7800: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
7810: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
7820: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
7830: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
7840: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
7850: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
7860: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
7870: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
7880: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
7890: 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20  pOp->p5,.#ifdef 
78a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
78b0: 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74     pOp->zComment
78c0: 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   ? pOp->zComment
78d0: 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20   : "".#else.    
78e0: 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b    "".#endif.  );
78f0: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
7900: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7910: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
7920: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
7930: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
7940: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
7950: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
7960: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
7970: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64  ){.    Mem *pEnd
7980: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
7990: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75  b = p->db;.    u
79a0: 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  8 malloc_failed 
79b0: 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
79c0: 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ed;.    if( db->
79d0: 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a  pnBytesFreed ){.
79e0: 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26        for(pEnd=&
79f0: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
7a00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
7a10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7a20: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
7a30: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b   }.      return;
7a40: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
7a50: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
7a60: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61  d; p++){.      a
7a70: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
7a80: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
7a90: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20  =p[1].db );..   
7aa0: 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
7ab0: 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e   is really an in
7ac0: 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  lined version of
7ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7ae0: 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a  elease().      *
7af0: 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76  * that takes adv
7b00: 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61  antage of the fa
7b10: 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ct that the memo
7b20: 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73  ry cell value is
7b30: 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67   .      ** being
7b40: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74   set to NULL aft
7b50: 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79  er releasing any
7b60: 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
7b70: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
7b80: 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66     ** The justif
7b90: 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  ication for dupl
7ba0: 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20  icating code is 
7bb0: 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74  that according t
7bc0: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  o .      ** call
7bd0: 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73  grind, this caus
7be0: 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73  es a certain tes
7bf0: 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68  t case to hit th
7c00: 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20  e CPU 4.7 .     
7c10: 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73   ** percent less
7c20: 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63   (x86 linux, gcc
7c30: 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20   version 4.1.2, 
7c40: 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20  -O6) than if .  
7c50: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65      ** sqlite3Me
7c60: 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20  mRelease() were 
7c70: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65  called from here
7c80: 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73  . With -O2, this
7c90: 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20   jumps.      ** 
7ca0: 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20  to 6.6 percent. 
7cb0: 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73  The test case is
7cc0: 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20   inserting 1000 
7cd0: 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c  rows into a tabl
7ce0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  e .      ** with
7cf0: 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e   no indexes usin
7d00: 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61  g a single prepa
7d10: 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  red INSERT state
7d20: 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20  ment, bind() .  
7d30: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
7d40: 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20  (). Inserts are 
7d50: 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74  grouped into a t
7d60: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
7d70: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
7d80: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
7d90: 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61  |MEM_Dyn|MEM_Fra
7da0: 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29  me|MEM_RowSet) )
7db0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7dc0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
7dd0: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
7de0: 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  if( p->zMalloc )
7df0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7e00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
7e10: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
7e20: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b   p->zMalloc = 0;
7e30: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7e40: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  p->flags = MEM_I
7e50: 6e 76 61 6c 69 64 3b 0a 20 20 20 20 7d 0a 20 20  nvalid;.    }.  
7e60: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
7e70: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
7e80: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed;.  }.}../*.**
7e90: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
7ea0: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
7eb0: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
7ec0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
7ed0: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
7ee0: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
7ef0: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
7f00: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
7f10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7f20: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
7f30: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
7f40: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
7f50: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
7f60: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
7f70: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
7f80: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
7f90: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
7fa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7fb0: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
7fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7fd0: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
7fe0: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
7ff0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
8000: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
8010: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
8020: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c  DbFree(p->v->db,
8030: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   p);.}..#ifndef 
8040: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8050: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
8060: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
8070: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
8080: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
8090: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
80a0: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
80b0: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
80c0: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
80d0: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
80e0: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
80f0: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
8100: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
8110: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
8120: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
8130: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
8140: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
8150: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
8160: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
8170: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
8180: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
8190: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
81a0: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
81b0: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
81c0: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
81d0: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
81e0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
81f0: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
8200: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
8210: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
8220: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a   QUERY PLAN..**.
8230: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
8240: 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65  in==1, first the
8250: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73   main program is
8260: 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61   listed, then ea
8270: 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69  ch of.** the tri
8280: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
8290: 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20   are listed one 
82a0: 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  by one..*/.int s
82b0: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
82c0: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
82e0: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
82f0: 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  int nRow;       
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65       /* Stop whe
8320: 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63  n row count reac
8330: 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  hes this */.  in
8340: 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20  t nSub = 0;     
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8370: 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73  sub-vdbes seen s
8380: 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72  o far */.  SubPr
8390: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20  ogram **apSub = 
83a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
83b0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d  /* Array of sub-
83c0: 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  vdbes */.  Mem *
83d0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
8400: 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62  old array of sub
8410: 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  progs */.  sqlit
8420: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
8450: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
8460: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8490: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
84a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
84c0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
84d0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26  .  Mem *pMem = &
84e0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20  p->aMem[1];     
84f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8500: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
8510: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
8520: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
8530: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
8540: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
8550: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
8560: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8570: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
8580: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
8590: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
85a0: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
85b0: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
85c0: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
85d0: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
85e0: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
85f0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
8600: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
8610: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
8620: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
8630: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
8640: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
8650: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
8660: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
8670: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
8680: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70  ay(pMem, 8);.  p
8690: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
86a0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
86b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
86c0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
86d0: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
86e0: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
86f0: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
8700: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
8710: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
8720: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
8730: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
8740: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
8750: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8760: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
8770: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
8780: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
8790: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
87a0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
87b0: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
87c0: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
87d0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
87e0: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
87f0: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
8800: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
8810: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
8820: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
8830: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
8840: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
8850: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
8860: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
8870: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
8880: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
8890: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
88a0: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
88b0: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
88c0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
88d0: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
88e0: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
88f0: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
8900: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
8910: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
8920: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
8930: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
8940: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
8950: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
8960: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
8970: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
8980: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
8990: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
89a0: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
89b0: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
89c0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
89d0: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
89e0: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
89f0: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
8a00: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
8a10: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
8a20: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
8a30: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
8a40: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
8a50: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
8a60: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
8a70: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
8a80: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
8a90: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
8aa0: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
8ab0: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
8ac0: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
8ad0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
8ae0: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
8af0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
8b00: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
8b10: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
8b20: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
8b30: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
8b40: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
8b50: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
8b60: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
8b70: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
8b80: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
8b90: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
8ba0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
8bb0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
8bc0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
8bd0: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
8be0: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
8bf0: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
8c00: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
8c10: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
8c20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8c30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
8c40: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
8c50: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
8c60: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
8c70: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
8c80: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
8c90: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8ca0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
8cb0: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
8cc0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
8cd0: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
8ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
8cf0: 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70   *z;.    Op *pOp
8d00: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
8d10: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
8d20: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
8d30: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
8d40: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
8d50: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
8d60: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
8d70: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
8d80: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
8d90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8da0: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
8db0: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
8dc0: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
8dd0: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
8de0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
8df0: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
8e00: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
8e10: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
8e20: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
8e30: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8e40: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
8e50: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8e60: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
8e70: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
8e80: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
8e90: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
8ea0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
8eb0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
8ec0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8ed0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
8ee0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8ef0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
8f00: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f30: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
8f40: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
8f50: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
8f60: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
8f70: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
8f80: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
8f90: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
8fa0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8fb0: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
8fc0: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
8fd0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
8fe0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
8ff0: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
9000: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
9010: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
9020: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
9030: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
9040: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
9050: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
9060: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
9070: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
9080: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
9090: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
90a0: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
90b0: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
90c0: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
90d0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
90e0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
90f0: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
9100: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
9110: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
9120: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
9130: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
9140: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
9150: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
9160: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
9170: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9180: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
9190: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
91a0: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
91b0: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
91c0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
91d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
91e0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
91f0: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
9200: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
9210: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
9220: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
9230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9240: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
9250: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
9260: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
9270: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
9280: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
9290: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
92a0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
92b0: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
92c0: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
92d0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
92e0: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
92f0: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
9300: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
9310: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
9320: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
9330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9340: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
9350: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
9360: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
9370: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
93a0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
93b0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
93c0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
93d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
93e0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
93f0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
9420: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
9430: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
9440: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
9450: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
9460: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
9470: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
9480: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
94a0: 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P3 */.    pMem-
94b0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
94c0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
94d0: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  ++;..    if( sql
94e0: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
94f0: 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20  pMem, 32, 0) ){ 
9500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34             /* P4
9510: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
9520: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
9530: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
9540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
9550: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  OR;.    }.    pM
9560: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9570: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
9580: 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69  Term;.    z = di
9590: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
95a0: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
95b0: 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b  f( z!=pMem->z ){
95c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
95d0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
95e0: 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
95f0: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
9600: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
9610: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
9620: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
9630: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
9640: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
9650: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
9660: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a  ITE_UTF8;.    }.
9670: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
9680: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
9690: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
96a0: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
96b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
96c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
96d0: 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a  (pMem, 4, 0) ){.
96e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
96f0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
9700: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
9710: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
9720: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
9730: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9740: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
9750: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
9760: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
9770: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9780: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
9790: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
97a0: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
97b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
97c0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
97d0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
97e0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
97f0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
9800: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9810: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
9820: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
9830: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
9840: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
9850: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
9860: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ->z = pOp->zComm
9870: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  ent;.        pMe
9880: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
9890: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
98a0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
98b0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
98c0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
98d0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
98e0: 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  XT;.      }else.
98f0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
9900: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
9910: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
9940: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  */.        pMem-
9950: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  >type = SQLITE_N
9960: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
9970: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
9980: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
9990: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
99a0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
99b0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
99c0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
99d0: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
99e0: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
99f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
9a00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9a10: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
9a20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9a30: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
9a40: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
9a50: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
9a60: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
9a70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9a80: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
9a90: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
9aa0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
9ab0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
9ac0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
9ad0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
9ae0: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
9af0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
9b00: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
9b10: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
9b20: 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
9b30: 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  z;.    while( sq
9b40: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
9b50: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
9b60: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
9b70: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
9b80: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
9b90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
9ba0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
9bb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
9bc0: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
9bd0: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
9be0: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
9bf0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
9c00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
9c10: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
9c20: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
9c30: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
9c40: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
9c50: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
9c60: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
9c70: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
9c80: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
9c90: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
9ca0: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
9cb0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
9cc0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
9cd0: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
9ce0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9cf0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
9d00: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
9d10: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
9d20: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
9d30: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
9d40: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
9d50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9d60: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
9d70: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
9d80: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
9d90: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
9da0: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
9db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9dc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
9dd0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
9de0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
9df0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
9e00: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
9e10: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
9e20: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
9e30: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
9e40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
9e50: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
9e60: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
9e70: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
9e80: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
9e90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
9ea0: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
9eb0: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
9ec0: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
9ed0: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
9ee0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
9ef0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
9f00: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
9f10: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
9f20: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
9f30: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
9f40: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
9f50: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
9f60: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
9f70: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
9f80: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
9f90: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
9fa0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
9fb0: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
9fc0: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
9fd0: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
9fe0: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
9ff0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
a000: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
a010: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
a020: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
a030: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
a040: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
a050: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
a060: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
a070: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
a080: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
a090: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
a0a0: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
a0b0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
a0c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
a0d0: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
a0e0: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
a0f0: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
a100: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
a110: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
a120: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
a130: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
a140: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
a150: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
a160: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
a170: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
a180: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
a190: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
a1a0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
a1b0: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
a1c0: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
a1d0: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
a1e0: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
a1f0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
a200: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
a210: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
a220: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
a230: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
a240: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
a250: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
a260: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
a270: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
a280: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
a290: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
a2a0: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
a2b0: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
a2c0: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
a2d0: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
a2e0: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
a2f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
a300: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
a310: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
a320: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
a330: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
a340: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
a350: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
a360: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
a370: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
a380: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
a390: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
a3a0: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
a3b0: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
a3c0: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
a3d0: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
a3e0: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
a3f0: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
a400: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
a410: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
a420: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
a430: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
a440: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
a450: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
a460: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
a470: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
a480: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
a490: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
a4a0: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
a4b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a4c0: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
a4d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a4e0: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
a4f0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
a500: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
a510: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
a520: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a530: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
a540: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
a550: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
a560: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
a570: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
a580: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
a590: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
a5a0: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
a5b0: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
a5c0: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
a5d0: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
a5e0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
a5f0: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
a600: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
a610: 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  1; i<p->nMem; i+
a620: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
a630: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
a640: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
a650: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
a660: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
a670: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
a680: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
a690: 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  t;.  p->magic = 
a6a0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
a6b0: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
a6c0: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
a6d0: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
a6e0: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
a6f0: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
a700: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
a710: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
a720: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
a730: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
a740: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
a750: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
a760: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
a770: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
a780: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
a790: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
a7a0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
a7b0: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
a7c0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
a7d0: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
a7e0: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
a7f0: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
a800: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
a810: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
a820: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
a830: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
a840: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
a850: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
a860: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
a870: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
a880: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
a890: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
a8a0: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
a8b0: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
a8c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
a8d0: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
a8e0: 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68  t once on a each
a8f0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a900: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
a910: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a920: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
a930: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
a940: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
a950: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
a960: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a970: 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73  ed, futher calls
a980: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
a990: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
a9a0: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
a9b0: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
a9c0: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
a9d0: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
a9e0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
a9f0: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
aa00: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
aa10: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
aa20: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
aa30: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
aa40: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
aa50: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
aa60: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
aa70: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
aa80: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
aa90: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
aaa0: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
aab0: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
aac0: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
aad0: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
aae0: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
aaf0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
ab00: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
ab30: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
ab40: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
ab50: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ab60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
ab70: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab90: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
aba0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
abb0: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
abd0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
abe0: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
abf0: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
ac00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ac10: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
ac20: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
ac30: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
ac60: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
ac70: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
aca0: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
acb0: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
acc0: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
acd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ace0: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
acf0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
ad00: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
ad30: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
ad60: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
ad70: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
ad80: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ada0: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
adb0: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
adc0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
adf0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
ae00: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
ae10: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
ae20: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
ae30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ae40: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
ae50: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
ae60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
ae70: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
ae80: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
ae90: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
aea0: 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
aeb0: 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
aec0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
aed0: 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
aee0: 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
aef0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
af00: 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72  ;.  nOnce = pPar
af10: 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  se->nOnce;.  if(
af20: 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63   nOnce==0 ) nOnc
af30: 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65  e = 1; /* Ensure
af40: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
af50: 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c  te in p->aOnceFl
af60: 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  ag[] */.  .  /* 
af70: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
af80: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
af90: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
afa0: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
afb0: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
afc0: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
afd0: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
afe0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
aff0: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
b000: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
b010: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
b020: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
b030: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
b040: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
b050: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
b060: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
b070: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
b080: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
b090: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
b0a0: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
b0b0: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
b0c0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
b0d0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
b0e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
b0f0: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
b100: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
b110: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
b120: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
b130: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
b140: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
b150: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69   for memory regi
b160: 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61  sters, SQL varia
b170: 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f  bles, VDBE curso
b180: 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20  rs and .  ** an 
b190: 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c  array to marshal
b1a0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
b1b0: 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f  guments in..  */
b1c0: 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26  .  zCsr = (u8*)&
b1d0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20  p->aOp[p->nOp]; 
b1e0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
b1f0: 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c  avaliable for al
b200: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45  location */.  zE
b210: 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  nd = (u8*)&p->aO
b220: 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20  p[p->nOpAlloc]; 
b230: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
b240: 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b  ast end of zCsr[
b250: 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ] */..  resolveP
b260: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
b270: 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
b280: 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
b290: 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
b2a0: 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
b2b0: 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
b2c0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
b2d0: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
b2e0: 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
b2f0: 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20  .  memset(zCsr, 
b300: 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20  0, zEnd-zCsr);. 
b310: 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d   zCsr += (zCsr -
b320: 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73   (u8*)0)&7;.  as
b330: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
b340: 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29  _ALIGNMENT(zCsr)
b350: 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64   );.  p->expired
b360: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
b370: 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
b380: 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
b390: 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
b3a0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20  located in two. 
b3b0: 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20   ** passes.  On 
b3c0: 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20  the first pass, 
b3d0: 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20  we try to reuse 
b3e0: 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20  unused space at 
b3f0: 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
b400: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
b410: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
b420: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
b430: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
b440: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
b450: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
b460: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
b470: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
b480: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
b490: 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75  ll in the rest u
b4a0: 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c  sing a fresh all
b4b0: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
b4c0: 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
b4d0: 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
b4e0: 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
b4f0: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
b500: 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
b510: 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20   leftover space 
b520: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
b530: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63  e opcode array c
b540: 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
b550: 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
b560: 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
b570: 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
b580: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
b590: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
b5a0: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70  nByte = 0;.    p
b5b0: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70  ->aMem = allocSp
b5c0: 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  ace(p->aMem, nMe
b5d0: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  m*sizeof(Mem), &
b5e0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
b5f0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72  te);.    p->aVar
b600: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
b610: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
b620: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
b630: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
b640: 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c     p->apArg = al
b650: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72  locSpace(p->apAr
b660: 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
b670: 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  em*), &zCsr, zEn
b680: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b690: 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63  p->azVar = alloc
b6a0: 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20  Space(p->azVar, 
b6b0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72  nVar*sizeof(char
b6c0: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
b6d0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
b6e0: 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70  >apCsr = allocSp
b6f0: 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43  ace(p->apCsr, nC
b700: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
b710: 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20  eCursor*),.     
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64       &zCsr, zEnd
b740: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b750: 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c  ->aOnceFlag = al
b760: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63  locSpace(p->aOnc
b770: 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a  eFlag, nOnce, &z
b780: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
b790: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
b7a0: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46  e ){.      p->pF
b7b0: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
b7c0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
b7d0: 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
b7e0: 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b  zCsr = p->pFree;
b7f0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73  .    zEnd = &zCs
b800: 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69  r[nByte];.  }whi
b810: 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62  le( nByte && !db
b820: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b830: 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  ;..  p->nCursor 
b840: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e  = nCursor;.  p->
b850: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63  nOnceFlag = nOnc
b860: 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72  e;.  if( p->aVar
b870: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20   ){.    p->nVar 
b880: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
b890: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
b8a0: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
b8b0: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
b8c0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
b8d0: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62     p->aVar[n].db
b8e0: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
b8f0: 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20  .  if( p->azVar 
b900: 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20  ){.    p->nzVar 
b910: 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  = pParse->nzVar;
b920: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  .    memcpy(p->a
b930: 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a  zVar, pParse->az
b940: 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69  Var, p->nzVar*si
b950: 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d  zeof(p->azVar[0]
b960: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  ));.    memset(p
b970: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c  Parse->azVar, 0,
b980: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73   pParse->nzVar*s
b990: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a  izeof(pParse->az
b9a0: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  Var[0]));.  }.  
b9b0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
b9c0: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65     /* aMem[] goe
b9f0: 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a  s from 1..nMem *
ba00: 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  /.    p->nMem = 
ba10: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
ba20: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e        /*       n
ba30: 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d  ot from 0..nMem-
ba40: 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31  1 */.    for(n=1
ba50: 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  ; n<=nMem; n++){
ba60: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  .      p->aMem[n
ba70: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ].flags = MEM_In
ba80: 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70 2d 3e  valid;.      p->
ba90: 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aMem[n].db = db;
baa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
bab0: 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65  explain = pParse
bac0: 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c  ->explain;.  sql
bad0: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70  ite3VdbeRewind(p
bae0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
baf0: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
bb00: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
bb10: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
bb20: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
bb30: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
bb40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
bb50: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
bb60: 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72  e *p, VdbeCursor
bb70: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
bb80: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
bb90: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
bba0: 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
bbb0: 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20  (p->db, pCx);.  
bbc0: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
bbd0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
bbe0: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
bbf0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d  .    /* The pCx-
bc00: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
bc10: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
bc20: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
bc30: 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  ts, by.    ** th
bc40: 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f  e call above. */
bc50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78  .  }else if( pCx
bc60: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
bc70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
bc80: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43  seCursor(pCx->pC
bc90: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
bca0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bcb0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
bcc0: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
bcd0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
bce0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
bcf0: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
bd00: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
bd10: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
bd20: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
bd30: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
bd40: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
bd50: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70  ethod = 1;.    p
bd60: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
bd70: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20  VtabCursor);.   
bd80: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
bd90: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
bda0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
bdb0: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
bdc0: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
bdd0: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
bde0: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
bdf0: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
be00: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
be10: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
be20: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
be30: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
be40: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
be50: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
be60: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
be70: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
be80: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
be90: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
bea0: 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  .  v->aOnceFlag 
beb0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46  = pFrame->aOnceF
bec0: 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46  lag;.  v->nOnceF
bed0: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  lag = pFrame->nO
bee0: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f  nceFlag;.  v->aO
bef0: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
bf00: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
bf10: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
bf20: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
bf30: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
bf40: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
bf50: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
bf60: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
bf70: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
bf80: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
bf90: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
bfa0: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
bfb0: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
bfc0: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
bfd0: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
bfe0: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
bff0: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
c000: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
c010: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
c020: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
c030: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
c040: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
c050: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
c060: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
c070: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
c080: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
c090: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
c0a0: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
c0b0: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
c0c0: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
c0d0: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
c0e0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
c0f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
c100: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
c110: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
c120: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
c130: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
c140: 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
c150: 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
c160: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
c170: 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
c180: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
c190: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
c1a0: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20  e(pFrame);.  }. 
c1b0: 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a   p->pFrame = 0;.
c1c0: 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
c1d0: 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ..  if( p->apCsr
c1e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
c1f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
c200: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
c210: 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72        VdbeCursor
c220: 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b   *pC = p->apCsr[
c230: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  i];.      if( pC
c240: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c250: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
c260: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
c270: 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
c280: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
c290: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
c2a0: 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
c2b0: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
c2c0: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  em[1], p->nMem);
c2d0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
c2e0: 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
c2f0: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
c300: 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
c310: 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
c320: 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
c330: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
c340: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
c350: 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Del);.  }.}../*.
c360: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
c370: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
c380: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
c390: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
c3a0: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
c3b0: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
c3c0: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
c3d0: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
c3e0: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
c3f0: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
c400: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
c410: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
c420: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
c430: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
c440: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
c450: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
c460: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
c470: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
c480: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
c490: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
c4a0: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
c4b0: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
c4c0: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
c4d0: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
c4e0: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
c4f0: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
c500: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
c510: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d   ) for(i=0; i<p-
c520: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
c530: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
c540: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  i]==0 );.  if( p
c550: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  ->aMem ){.    fo
c560: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
c570: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
c580: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
c590: 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20 29 3b  ==MEM_Invalid );
c5a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
c5b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c5c0: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
c5d0: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
c5e0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
c5f0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
c600: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
c610: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
c620: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
c630: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
c640: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
c650: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
c660: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
c670: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
c680: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
c690: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
c6a0: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
c6b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
c6c0: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
c6d0: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
c6e0: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
c6f0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
c700: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c710: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
c720: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
c730: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43  lumn){.  Mem *pC
c740: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  olName;.  int n;
c750: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c760: 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61   p->db;..  relea
c770: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
c780: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
c790: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
c7a0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
c7b0: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
c7c0: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
c7d0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
c7e0: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
c7f0: 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
c800: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
c810: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
c820: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
c830: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c840: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
c850: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
c860: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
c870: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
c880: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
c890: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
c8a0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62      pColName->db
c8b0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43   = p->db;.    pC
c8c0: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a  olName++;.  }.}.
c8d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
c8e0: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
c8f0: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
c900: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
c910: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
c920: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
c930: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
c940: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
c950: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
c960: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
c970: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
c980: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
c990: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
c9a0: 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   The final param
c9b0: 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74  eter, xDel, must
c9c0: 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   be one of SQLIT
c9d0: 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54  E_DYNAMIC, SQLIT
c9e0: 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53  E_STATIC.** or S
c9f0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e  QLITE_TRANSIENT.
ca00: 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45   If it is SQLITE
ca10: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74  _DYNAMIC, then t
ca20: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
ca30: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65  d.** to by zName
ca40: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
ca50: 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  y sqlite3DbFree(
ca60: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
ca70: 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f  is destroyed..*/
ca80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
ca90: 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64  SetColName(.  Vd
caa0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e  * Vdbe being con
cad0: 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74  figured */.  int
cae0: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb00: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
cb10: 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74   zName applies t
cb20: 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20  o */.  int var, 
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
cb50: 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20  f the COLNAME_* 
cb60: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63  constants */.  c
cb70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
cb80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cb90: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
cba0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
cbb0: 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  name */.  void (
cbc0: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20  *xDel)(void*)   
cbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
cbe0: 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
cbf0: 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61  strategy for zNa
cc00: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  me */.){.  int r
cc10: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
cc20: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
cc30: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
cc40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
cc50: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
cc60: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
cc70: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
cc80: 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c  ssert( !zName ||
cc90: 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59   xDel!=SQLITE_DY
cca0: 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74  NAMIC );.    ret
ccb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ccc0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ccd0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
cce0: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
ccf0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
cd00: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
cd10: 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
cd20: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
cd30: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
cd40: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
cd50: 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
cd60: 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
cd70: 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
cd80: 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
cd90: 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
cda0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
cdb0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
cdc0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
cdd0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
cde0: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
cdf0: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
ce00: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
ce10: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
ce20: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
ce30: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
ce40: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
ce50: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
ce60: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
ce70: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
ce80: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
ce90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
cea0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
ceb0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
cec0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
ced0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
cee0: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
cef0: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
cf00: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
cf10: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
cf20: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
cf30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
cf40: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
cf50: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
cf60: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
cf70: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
cf80: 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
cf90: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
cfa0: 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
cfb0: 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
cfc0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
cfd0: 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
cfe0: 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
cff0: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
d000: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
d010: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
d020: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
d030: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
d040: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
d050: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
d060: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
d070: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
d080: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
d090: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
d0a0: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
d0b0: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
d0c0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
d0d0: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
d0e0: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
d0f0: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
d100: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
d110: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
d120: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
d130: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
d140: 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a  abSync(db, &p->z
d150: 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20 54  ErrMsg);..  /* T
d160: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
d170: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
d180: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
d190: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
d1a0: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
d1b0: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
d1c0: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
d1d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
d1e0: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
d1f0: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
d200: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
d210: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
d220: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
d230: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
d240: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
d250: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
d260: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
d270: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
d280: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
d290: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
d2a0: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
d2b0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d2c0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d2d0: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
d2e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
d2f0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
d300: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
d310: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
d320: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
d330: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
d340: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
d350: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d360: 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
d370: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
d380: 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
d390: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
d3a0: 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
d3b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
d3c0: 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
d3d0: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
d3e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
d3f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
d400: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
d410: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
d420: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
d430: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
d440: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
d450: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
d460: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
d470: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
d480: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
d490: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
d4a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
d4b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d4c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
d4d0: 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d  OMMITHOOK;.    }
d4e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
d4f0: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
d500: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
d510: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
d520: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
d530: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
d540: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
d550: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
d560: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
d570: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
d580: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
d590: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
d5a0: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
d5b0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
d5c0: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
d5d0: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
d5e0: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
d5f0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
d600: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
d610: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
d620: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
d630: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
d640: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
d650: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
d660: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
d670: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
d680: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
d690: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
d6a0: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
d6b0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
d6c0: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
d6d0: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
d6e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
d6f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
d700: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
d710: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
d720: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
d730: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
d740: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d750: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
d760: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
d770: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d780: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
d790: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
d7a0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
d7b0: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
d7c0: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
d7d0: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
d7e0: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
d7f0: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
d800: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
d810: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
d820: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
d830: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
d840: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
d850: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
d860: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
d870: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
d880: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
d890: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
d8a0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
d8b0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
d8c0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d8d0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d8e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
d8f0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
d900: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
d910: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
d920: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d930: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
d940: 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20  seTwo(pBt, 0);. 
d950: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d960: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d970: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
d980: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
d990: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
d9a0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
d9b0: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
d9c0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
d9d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
d9e0: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
d9f0: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
da00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
da10: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
da20: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
da30: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
da40: 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  cly..  */.#ifnde
da50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
da60: 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
da70: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
da80: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
da90: 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
daa0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
dab0: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
dac0: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
dad0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
dae0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
daf0: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
db00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
db10: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
db20: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
db30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
db40: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
db50: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
db60: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
db70: 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30  t retryCount = 0
db80: 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46  ;.    int nMainF
db90: 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  ile;..    /* Sel
dba0: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
dbb0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
dbc0: 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20  /.    nMainFile 
dbd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
dbe0: 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  0(zMainFile);.  
dbf0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
dc00: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
dc10: 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22  %s-mjXXXXXX9XXz"
dc20: 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  , zMainFile);.  
dc30: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30    if( zMaster==0
dc40: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
dc50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b  _NOMEM;.    do {
dc60: 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
dc70: 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  om;.      if( re
dc80: 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  tryCount ){.    
dc90: 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
dca0: 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  nt>100 ){.      
dcb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
dcc0: 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
dcd0: 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d   delete: %s", zM
dce0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
dcf0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
dd00: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
dd10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62   0);.          b
dd20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
dd30: 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75  lse if( retryCou
dd40: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  nt==1 ){.       
dd50: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
dd60: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
dd70: 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d  collide: %s", zM
dd80: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
dd90: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
dda0: 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20  retryCount++;.  
ddb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
ddc0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
ddd0: 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
dde0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ddf0: 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a  _snprintf(13, &z
de00: 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65  Master[nMainFile
de10: 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58  ], "-mj%06X9%02X
de20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30    (iRandom>>8)&0
de50: 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d  xffffff, iRandom
de60: 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a  &0xff);.      /*
de70: 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69   The antipenulti
de80: 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f  mate character o
de90: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
dea0: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20  rnal name must. 
deb0: 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74       ** be "9" t
dec0: 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c  o avoid name col
ded0: 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69  lisions when usi
dee0: 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  ng 8+3 filenames
def0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
df00: 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74  t( zMaster[sqlit
df10: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74  e3Strlen30(zMast
df20: 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20  er)-3]=='9' );. 
df30: 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65       sqlite3File
df40: 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c  Suffix3(zMainFil
df50: 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  e, zMaster);.   
df60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
df70: 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
df80: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
df90: 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
dfa0: 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  s);.    }while( 
dfb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dfc0: 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20   res );.    if( 
dfd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dfe0: 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
dff0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e000: 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  l. */.      rc =
e010: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
e020: 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
e030: 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
e040: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
e050: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
e060: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
e070: 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E|.          SQL
e080: 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
e090: 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
e0a0: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
e0b0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
e0c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e0d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
e0e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e0f0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
e100: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e110: 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
e120: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
e130: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
e140: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
e150: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
e160: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
e170: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
e180: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
e190: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
e1a0: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
e1b0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e1c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
e1d0: 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
e1e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
e1f0: 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
e200: 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
e210: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
e220: 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
e230: 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
e240: 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
e250: 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
e260: 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
e270: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
e280: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
e290: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e2a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e2b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e2c0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
e2d0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
e2e0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
e2f0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
e300: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
e310: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
e320: 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   zFile==0 ){.   
e330: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
e340: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
e350: 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
e360: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
e370: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
e380: 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30  ert( zFile[0]!=0
e390: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e3a0: 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
e3b0: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
e3c0: 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
e3d0: 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
e3e0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
e3f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e400: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
e410: 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
e420: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
e430: 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
e440: 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
e450: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e460: 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
e470: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e480: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e490: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e4a0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
e4b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e4c0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
e4d0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
e4e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
e4f0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
e500: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
e510: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
e520: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
e530: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
e540: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e550: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
e560: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
e570: 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
e580: 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
e590: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
e5a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
e5b0: 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30  dSync .     && 0
e5c0: 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
e5d0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
e5e0: 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
e5f0: 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
e600: 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
e610: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
e620: 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
e630: 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
e640: 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
e650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
e660: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
e670: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e680: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
e690: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
e6a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e6b0: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e6c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e6d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
e6e0: 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
e6f0: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
e700: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
e710: 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
e720: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
e730: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
e740: 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
e750: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
e760: 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
e770: 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
e780: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
e790: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e7a0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
e7b0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
e7c0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
e7d0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
e7e0: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
e7f0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
e800: 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
e810: 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
e820: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
e830: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e840: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
e850: 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
e860: 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
e870: 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
e880: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e890: 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
e8a0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
e8b0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
e8c0: 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
e8d0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
e8e0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
e8f0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e900: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
e910: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
e920: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e930: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e940: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
e950: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
e960: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
e970: 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
e980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e990: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
e9a0: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
e9b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e9c0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
e9d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e9e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
e9f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ea00: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
ea10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ea20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
ea30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ea40: 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
ea50: 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
ea60: 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
ea70: 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
ea80: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
ea90: 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
eaa0: 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
eab0: 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
eac0: 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
ead0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
eae0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
eaf0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
eb00: 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
eb10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
eb20: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
eb30: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
eb40: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
eb50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
eb60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
eb70: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
eb80: 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
eb90: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
eba0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
ebb0: 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
ebc0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
ebd0: 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
ebe0: 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
ebf0: 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
ec00: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
ec10: 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
ec20: 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
ec30: 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
ec40: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
ec50: 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
ec60: 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
ec70: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
ec80: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
ec90: 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
eca0: 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
ecb0: 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
ecc0: 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
ecd0: 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
ece0: 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
ecf0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
ed00: 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
ed10: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
ed20: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
ed30: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
ed40: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
ed50: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
ed60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
ed70: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
ed80: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
ed90: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
eda0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
edb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
edc0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
edd0: 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
ede0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
edf0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
ee00: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
ee10: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
ee20: 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
ee30: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
ee40: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
ee50: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
ee60: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
ee70: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
ee80: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
ee90: 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
eea0: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
eeb0: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
eec0: 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
eed0: 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
eee0: 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
eef0: 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
ef00: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
ef10: 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
ef20: 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
ef30: 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
ef40: 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
ef50: 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
ef60: 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
ef70: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
ef80: 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
ef90: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
efa0: 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
efb0: 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
efc0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
efd0: 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
efe0: 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
eff0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
f000: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
f010: 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
f020: 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
f030: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
f040: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
f050: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
f060: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
f070: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
f080: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
f090: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
f0a0: 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
f0b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49  .      if( p->bI
f0c0: 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b  sReader ) nRead+
f0d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
f0e0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
f0f0: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
f100: 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b  ->nVdbeActive );
f110: 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
f120: 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  e==db->nVdbeWrit
f130: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
f140: 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52  Read==db->nVdbeR
f150: 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ead );.}.#else.#
f160: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
f170: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
f180: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
f190: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
f1a0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
f1b0: 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
f1c0: 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
f1d0: 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
f1e0: 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
f1f0: 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
f200: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
f210: 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
f220: 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
f230: 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
f240: 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
f250: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
f260: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
f270: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
f280: 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
f290: 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
f2a0: 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
f2b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
f2c0: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
f2d0: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
f2e0: 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
f2f0: 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
f300: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
f310: 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
f320: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
f330: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
f340: 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
f350: 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
f360: 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
f370: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
f380: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f390: 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
f3a0: 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
f3b0: 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
f3c0: 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
f3d0: 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
f3e0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f3f0: 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
f400: 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
f410: 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
f420: 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
f430: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
f440: 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63  have occurred, c
f450: 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65  ausing an emerge
f460: 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  ncy rollback..  
f470: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
f480: 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d  (db->nStatement=
f490: 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69  =0), and there i
f4a0: 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  s nothing to do.
f4b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
f4c0: 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
f4d0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
f4e0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
f4f0: 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
f500: 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
f510: 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
f520: 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
f530: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
f540: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
f550: 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
f560: 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
f570: 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
f580: 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
f590: 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
f5a0: 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
f5b0: 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
f5c0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
f5d0: 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
f5e0: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
f5f0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
f600: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f610: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
f620: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f630: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f640: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
f650: 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
f660: 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
f670: 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
f680: 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
f690: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
f6a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
f6b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f6c0: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
f6d0: 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
f6e0: 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
f6f0: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
f700: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f710: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
f720: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f730: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f740: 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
f750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f760: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
f770: 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
f780: 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ment = 0;..    i
f790: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f7a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
f7b0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
f7c0: 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
f7d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
f7e0: 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
f7f0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f800: 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
f810: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f820: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f830: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f840: 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
f850: 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
f860: 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
f870: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
f880: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f890: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
f8a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
f8b0: 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
f8c0: 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
f8d0: 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
f8e0: 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
f8f0: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
f900: 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
f910: 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
f920: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
f930: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f940: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
f950: 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
f960: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f970: 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
f980: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
f990: 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
f9a0: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
f9b0: 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
f9c0: 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
f9d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f9e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f9f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
fa00: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
fa10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
fa20: 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
fa30: 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
fa40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
fa50: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
fa60: 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
fa70: 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
fa80: 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
fa90: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
faa0: 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
fab0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
fac0: 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
fad0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
fae0: 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
faf0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
fb00: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
fb10: 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
fb20: 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
fb30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
fb40: 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
fb50: 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
fb60: 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
fb70: 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
fb80: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
fb90: 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
fba0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
fbb0: 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
fbc0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
fbd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fbe0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
fbf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
fc00: 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
fc10: 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
fc20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fc30: 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
fc40: 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
fc50: 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
fc60: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
fc70: 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
fc80: 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
fc90: 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
fca0: 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
fcb0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
fcc0: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
fcd0: 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
fce0: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
fcf0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
fd00: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
fd10: 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  db, "foreign key
fd20: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
fd30: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
fd40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
fd50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
fd60: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
fd70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fd80: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
fd90: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
fda0: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
fdb0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
fdc0: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
fdd0: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
fde0: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
fdf0: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
fe00: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
fe10: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
fe20: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
fe30: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
fe40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
fe50: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
fe60: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
fe70: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
fe80: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
fe90: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
fea0: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
feb0: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
fec0: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
fed0: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
fee0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
fef0: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
ff00: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
ff10: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
ff20: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
ff30: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
ff40: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
ff50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ff60: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
ff70: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
ff80: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
ff90: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
ffa0: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
ffb0: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
ffc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ffd0: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
ffe0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
10010 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
10020 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
10030 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
10040 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
10050 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
10060 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
10070 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
10080 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
10090 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
100a0 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
100b0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
100c0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
100d0 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
100e0 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
100f0 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
10100 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
10110 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
10120 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
10130 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
10140 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
10150 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
10160 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
10170 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
10180 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
10190 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
101a0 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
101b0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
101c0 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
101d0 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
101e0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
101f0 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
10200 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10210 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
10220 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
10230 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
10240 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
10250 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
10260 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
10270 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
10280 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
10290 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
102a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
102b0 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20   p->aOnceFlag ) 
102c0 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46  memset(p->aOnceF
102d0 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65  lag, 0, p->nOnce
102e0 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c  Flag);.  closeAl
102f0 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
10300 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
10310 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
10320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10330 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
10340 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
10350 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
10360 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
10370 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
10380 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
10390 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
103a0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
103b0 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
103c0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
103d0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
103e0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
103f0 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
10400 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
10410 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
10420 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
10430 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
10440 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
10450 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
10460 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
10470 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
10480 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
10490 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
104a0 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
104b0 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
104c0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
104d0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
104e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
104f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
10500 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
10510 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
10520 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74  0xff;.    assert
10530 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
10540 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
10550 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
10560 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73  no longer exists
10570 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61   */.    isSpecia
10580 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
10590 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
105a0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
105d0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
105e0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
105f0 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
10600 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
10610 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
10620 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
10630 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
10640 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
10650 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
10660 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
10670 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
10680 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
10690 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
106a0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
106b0 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
106c0 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
106d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
106e0 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
106f0 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
10700 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10710 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
10720 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
10730 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
10740 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
10750 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
10760 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
10770 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
10780 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
10790 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
107a0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77  occurred while w
107b0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
107c0 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e  urnal, sub-journ
107d0 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20  al or database. 
107e0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
107f0 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72  part of an effor
10800 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63  t to free up cac
10810 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75  he space (see fu
10820 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
10830 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
10840 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72   pager.c), the r
10850 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69  ollback is requi
10860 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a  red to restore .
10870 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67        ** the pag
10880 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65  er to a consiste
10890 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
108a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  */.      if( !p-
108b0 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63  >readOnly || mrc
108c0 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  !=SQLITE_INTERRU
108d0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  PT ){.        if
108e0 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  ( (mrc==SQLITE_N
108f0 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
10900 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e  ITE_FULL) && p->
10910 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
10920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  ){.          eSt
10930 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
10940 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
10950 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10960 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
10970 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
10980 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
10990 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
109a0 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
109b0 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
109c0 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
109d0 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
109e0 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
109f0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
10a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
10a10 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10a20 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
10a30 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
10a40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10a50 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
10a60 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
10a70 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
10a80 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
10a90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10aa0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
10ab0 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
10ac0 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
10ad0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
10ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b00 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
10b10 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
10b20 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
10b30 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
10b40 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
10b50 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
10b60 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
10b70 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
10b80 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
10b90 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
10ba0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
10bb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
10bc0 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
10bd0 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
10be0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
10bf0 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
10c00 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
10c10 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
10c20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
10c30 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
10c40 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
10c50 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
10c60 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
10c70 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  e==(p->readOnly=
10c80 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
10c90 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
10ca0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
10cb0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
10cc0 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
10cd0 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
10ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
10cf0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
10d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
10d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10d20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
10d30 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
10d40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
10d50 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
10d60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
10d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10d80 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
10d90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
10da0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10db0 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
10dc0 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
10dd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
10de0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
10df0 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
10e00 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
10e10 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
10e20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
10e30 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
10e40 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
10e50 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
10e60 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
10e70 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
10e80 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
10e90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
10ea0 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
10eb0 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
10ec0 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
10ed0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
10ee0 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
10ef0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
10f00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
10f10 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
10f20 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
10f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
10f50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10f60 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
10f70 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
10f80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10f90 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
10fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10fb0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
10fc0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
10fd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10fe0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
10ff0 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
11000 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
11010 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
11020 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
11030 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
11040 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20  E_DeferFKs;.    
11050 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
11060 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
11070 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
11080 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
11090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
110a0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
110b0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
110c0 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61  }.      db->nSta
110d0 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
110e0 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
110f0 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  mentOp==0 ){.   
11100 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
11110 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
11120 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
11130 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  il ){.        eS
11140 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
11150 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a  EPOINT_RELEASE;.
11160 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11170 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
11180 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
11190 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
111a0 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
111b0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  LBACK;.      }el
111c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
111d0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
111e0 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
111f0 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
11200 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
11210 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
11220 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
11230 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
11240 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
11250 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
11260 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
11270 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
11280 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
11290 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
112a0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
112b0 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
112c0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
112d0 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
112e0 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
112f0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
11300 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
11310 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
11320 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
11330 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
11340 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
11350 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
11360 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a  hen promote the.
11370 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
11380 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63  tatement error c
11390 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
113a0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
113b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
113c0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
113d0 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
113e0 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
113f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11400 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
11410 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72  LITE_OK || (p->r
11420 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
11430 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
11440 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
11450 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
11460 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11470 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
11480 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
11490 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
114a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
114b0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
114c0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
114d0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
114e0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
114f0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
11500 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
11510 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
11520 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
11530 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
11540 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
11550 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
11560 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
11570 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
11580 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
11590 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
115a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
115b0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
115c0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
115d0 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
115e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
115f0 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
11600 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
11610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11620 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
11630 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
11640 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11660 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
11670 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11680 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
11690 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
116a0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
116b0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
116c0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  dbeLeave(p);.  }
116d0 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
116e0 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
116f0 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
11700 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
11710 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
11720 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
11730 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76    db->nVdbeActiv
11740 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d  e--;.    if( !p-
11750 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e  >readOnly ) db->
11760 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20  nVdbeWrite--;.  
11770 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
11780 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65  er ) db->nVdbeRe
11790 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ad--;.    assert
117a0 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
117b0 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  e>=db->nVdbeRead
117c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
117d0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64  db->nVdbeRead>=d
117e0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
117f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
11800 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29  >nVdbeWrite>=0 )
11810 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
11820 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
11830 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
11840 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
11850 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
11860 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
11870 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
11880 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
11890 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
118a0 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
118b0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
118c0 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
118d0 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
118e0 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
118f0 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
11900 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
11910 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
11920 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
11930 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
11940 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
11950 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
11960 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
11970 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
11980 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
11990 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
119a0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
119b0 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62  beActive>0 || db
119c0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
119d0 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  || db->nStatemen
119e0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
119f0 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
11a00 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55  BUSY ? SQLITE_BU
11a10 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  SY : SQLITE_OK);
11a20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
11a30 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
11a40 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
11a50 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
11a60 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
11a70 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
11a80 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
11a90 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
11aa0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
11ab0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
11ac0 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
11ad0 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
11ae0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
11af0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
11b00 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
11b10 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c  rror message bel
11b20 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44  onging to the VD
11b30 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  BE passed.** as 
11b40 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
11b50 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61  nt to its databa
11b60 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68  se handle (so th
11b70 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
11b80 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20  .** returned by 
11b90 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
11ba0 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73  _errcode() and s
11bb0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29  qlite3_errmsg())
11bc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
11bd0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
11be0 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72  lear the VDBE er
11bf0 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73  ror code or mess
11c00 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70  age, just.** cop
11c10 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ies them to the 
11c20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
11c30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11c40 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
11c50 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
11c60 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
11c70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  ;.  int rc = p->
11c80 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72  rc;.  if( p->zEr
11c90 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d  rMsg ){.    u8 m
11ca0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62  allocFailed = db
11cb0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
11cc0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11cd0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11ce0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
11cf0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
11d00 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
11d10 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
11d20 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
11d30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
11d40 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11d50 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
11d60 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
11d70 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
11d80 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
11d90 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
11da0 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
11db0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11dc0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
11dd0 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
11de0 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49  /*.** If an SQLI
11df0 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
11e00 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65   hook is registe
11e10 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68  red and the VM h
11e20 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a  as been run, .**
11e30 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73   invoke it..*/.s
11e40 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49  tatic void vdbeI
11e50 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65  nvokeSqllog(Vdbe
11e60 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *v){.  if( sqli
11e70 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11e80 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63  xSqllog && v->rc
11e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76  ==SQLITE_OK && v
11ea0 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e  ->zSql && v->pc>
11eb0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
11ec0 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69  zExpanded = sqli
11ed0 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c  te3VdbeExpandSql
11ee0 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20  (v, v->zSql);.  
11ef0 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d    assert( v->db-
11f00 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b  >init.busy==0 );
11f10 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64  .    if( zExpand
11f20 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
11f30 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11f40 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20  xSqllog(.       
11f50 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
11f60 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
11f70 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  g, v->db, zExpan
11f80 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a  ded, 1.      );.
11f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11fa0 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61  ree(v->db, zExpa
11fb0 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nded);.    }.  }
11fc0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
11fd0 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  e vdbeInvokeSqll
11fe0 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  og(x).#endif../*
11ff0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
12000 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
12010 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
12020 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
12030 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
12040 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
12050 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
12060 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
12070 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
12080 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
12090 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
120a0 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
120b0 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
120c0 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
120d0 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
120e0 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
120f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
12100 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
12110 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
12120 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
12130 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
12140 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
12150 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
12160 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
12170 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
12180 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
12190 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
121a0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
121b0 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
121c0 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
121d0 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
121e0 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
121f0 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
12200 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
12210 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
12220 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
12230 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
12240 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
12250 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
12260 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
12270 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
12280 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
12290 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
122a0 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
122b0 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
122c0 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
122d0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
122e0 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
122f0 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
12300 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
12310 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
12320 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
12330 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
12340 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
12350 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
12360 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
12370 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
12380 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
12390 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
123a0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
123b0 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g(p);.    sqlite
123c0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
123d0 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  or(p);.    sqlit
123e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
123f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
12400 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
12410 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
12420 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
12430 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
12440 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
12450 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
12460 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
12470 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
12480 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
12490 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
124a0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
124b0 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
124c0 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
124d0 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
124e0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
124f0 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
12500 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
12510 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
12520 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
12530 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
12540 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
12550 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
12560 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
12570 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
12580 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
12590 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
125a0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
125b0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
125c0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
125d0 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
125e0 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
125f0 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
12600 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
12610 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
12620 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
12630 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
12640 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
12650 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
12660 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
12670 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
12680 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
12690 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
126a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
126b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
126c0 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
126d0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
126e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
126f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
12700 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
12710 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
12720 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
12730 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  , "\n");.      f
12740 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
12750 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12760 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36  fprintf(out, "%6
12770 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22  d %10lld %8lld "
12780 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
12790 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
127a0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
127b0 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
127c0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
127d0 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
127e0 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
127f0 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
12800 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
12810 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
12820 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
12830 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
12840 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
12850 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
12860 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
12870 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
12880 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
12890 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
128a0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
128b0 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
128c0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
128d0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
128e0 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
128f0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
12900 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
12910 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
12920 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
12930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
12940 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
12950 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
12960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
12970 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
12980 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
12990 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
129a0 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
129b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
129c0 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
129d0 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
129e0 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
129f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
12a00 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
12a10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12a20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74  ** Call the dest
12a30 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20  ructor for each 
12a40 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e  auxdata entry in
12a50 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77   pVdbeFunc for w
12a60 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72  hich.** the corr
12a70 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
12a80 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20   mask is clear. 
12a90 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   Auxdata entries
12aa0 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72   beyond 31.** ar
12ab0 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79  e always destroy
12ac0 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20  ed.  To destroy 
12ad0 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72  all auxdata entr
12ae0 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a  ies, call this.*
12af0 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d  * routine with m
12b00 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20  ask==0..*/.void 
12b10 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12b20 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75 6e  eAuxData(VdbeFun
12b30 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e  c *pVdbeFunc, in
12b40 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69  t mask){.  int i
12b50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
12b60 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20  VdbeFunc->nAux; 
12b70 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
12b80 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
12b90 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41   &pVdbeFunc->apA
12ba0 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28  ux[i];.    if( (
12bb0 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28  i>31 || !(mask&(
12bc0 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26  ((u32)1)<<i))) &
12bd0 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a  & pAux->pAux ){.
12be0 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
12bf0 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
12c00 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
12c10 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
12c20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78      }.      pAux
12c30 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
12c40 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
12c50 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
12c60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
12c70 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
12c80 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
12c90 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74  ument,.** except
12ca0 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65   for object itse
12cb0 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65  lf, which is pre
12cc0 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  served..**.** Th
12cd0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
12ce0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
12cf0 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  on and sqlite3Vd
12d00 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68  beDelete() is th
12d10 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65  at.** VdbeDelete
12d20 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20  () also unlinks 
12d30 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
12d40 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73  e list of VMs as
12d50 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
12d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
12d70 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nnection and fre
12d80 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74  es the object it
12d90 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  self..*/.void sq
12da0 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
12db0 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
12dc0 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75  , Vdbe *p){.  Su
12dd0 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20  bProgram *pSub, 
12de0 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b  *pNext;.  int i;
12df0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
12e00 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
12e10 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
12e20 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
12e30 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61  ->nVar);.  relea
12e40 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
12e50 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
12e60 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
12e70 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
12e80 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
12e90 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
12ea0 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
12eb0 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
12ec0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
12ed0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
12ee0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
12ef0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
12f00 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d  ;.  }.  for(i=p-
12f10 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nzVar-1; i>=0; 
12f20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72  i--) sqlite3DbFr
12f30 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b  ee(db, p->azVar[
12f40 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f  i]);.  vdbeFreeO
12f50 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
12f60 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
12f70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12f80 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71  p->aLabel);.  sq
12f90 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12fa0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
12fb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12fc0 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71  , p->zSql);.  sq
12fd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12fe0 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 20 64  p->pFree);.#if d
12ff0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
13000 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
13010 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  N).  sqlite3DbFr
13020 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61  ee(db, p->zExpla
13030 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  in);.  sqlite3Db
13040 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45 78 70  Free(db, p->pExp
13050 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lain);.#endif.}.
13060 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
13070 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
13080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
13090 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
130a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
130b0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
130c0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
130d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
130e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
130f0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
13100 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
13110 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
13120 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
13130 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
13140 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
13150 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
13160 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
13170 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
13180 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
13190 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
131a0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
131b0 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
131c0 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
131d0 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
131e0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
131f0 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
13200 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13210 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  , p);.}../*.** M
13220 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
13230 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
13240 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
13250 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
13260 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
13270 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
13280 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
13290 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
132a0 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
132b0 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
132c0 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
132d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
132e0 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
132f0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
13300 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
13310 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
13320 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
13330 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
13340 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
13350 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
13360 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
13370 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
13380 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
13390 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
133a0 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
133b0 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
133c0 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
133d0 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
133e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
133f0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
13400 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
13410 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
13420 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
13430 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
13440 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
13450 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
13460 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
13470 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
13480 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
13490 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
134a0 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
134b0 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
134c0 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
134d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
134e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
134f0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
13500 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  t;.#endif.    as
13510 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
13520 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
13530 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
13540 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73  npacked(p->pCurs
13550 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f  or, 0, p->moveto
13560 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29  Target, 0, &res)
13570 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
13580 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d  eturn rc;.    p-
13590 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e  >lastRowid = p->
135a0 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20  movetoTarget;.  
135b0 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72    if( res!=0 ) r
135c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
135d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
135e0 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
135f0 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
13600 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
13610 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
13620 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  +;.#endif.    p-
13630 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
13640 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68  = 0;.    p->cach
13650 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
13660 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  STALE;.  }else i
13670 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43 75  f( ALWAYS(p->pCu
13680 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  rsor) ){.    int
13690 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69   hasMoved;.    i
136a0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
136b0 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
136c0 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  ed(p->pCursor, &
136d0 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69  hasMoved);.    i
136e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
136f0 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f  c;.    if( hasMo
13700 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ved ){.      p->
13710 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
13720 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20  CHE_STALE;.     
13730 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
13740 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13760 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
13770 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
13780 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
13790 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
137a0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
137b0 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
137c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
137d0 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
137e0 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29  3VdbeSerialPut()
137f0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
13800 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a  erialGet().**.**
13810 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
13820 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
13830 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
13840 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
13850 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
13860 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
13870 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
13880 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
13890 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
138a0 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
138b0 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
138c0 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
138d0 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
138e0 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
138f0 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
13900 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
13910 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
13920 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
13930 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
13940 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
13950 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
13960 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
13970 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
13980 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
13990 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
139a0 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
139b0 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
139c0 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
139d0 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
139e0 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
139f0 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
13a00 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
13a10 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
13a20 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
13a30 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74  ata blob separat
13a40 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
13a50 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
13a60 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
13a70 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
13a80 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
13a90 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
13aa0 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
13ab0 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
13ac0 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
13ad0 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
13ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
13af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
13b00 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
13b10 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
13b20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
13b30 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
13b40 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
13b50 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
13b60 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
13b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b80 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
13b90 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13ba0 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
13bd0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
13be0 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
13bf0 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
13c00 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
13c10 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
13c40 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13c50 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
13c70 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13c80 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13c90 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
13ca0 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
13cb0 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
13cc0 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
13ce0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
13cf0 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
13d00 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
13d10 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
13d20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
13d30 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
13d40 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d60 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
13d70 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
13d80 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
13d90 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
13da0 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
13db0 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
13dc0 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
13dd0 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
13de0 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
13df0 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
13e00 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
13e10 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
13e20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
13e30 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
13e40 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
13e50 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
13e60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
13e70 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
13e80 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
13e90 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
13ea0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
13eb0 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
13ec0 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
13ed0 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61  rmat){.  int fla
13ee0 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
13ef0 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66  ;.  int n;..  if
13f00 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
13f10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
13f20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
13f30 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
13f40 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
13f50 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
13f60 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
13f70 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
13f80 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
13f90 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
13fa0 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
13fb0 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
13fc0 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
13fd0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
13fe0 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54  if( i<(-MAX_6BYT
13ff0 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20  E) ) return 6;. 
14000 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
14010 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20   test prevents: 
14020 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30   u = -(-92233720
14030 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a  36854775808) */.
14040 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20        u = -i;.  
14050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
14060 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
14070 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
14080 20 20 20 20 72 65 74 75 72 6e 20 28 28 69 26 31      return ((i&1
14090 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72  )==i && file_for
140a0 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32  mat>=4) ? 8+(u32
140b0 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20  )u : 1;.    }.  
140c0 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
140d0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
140e0 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20  f( u<=8388607 ) 
140f0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
14100 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
14110 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20  ) return 4;.    
14120 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
14130 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20   ) return 5;.   
14140 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
14150 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
14160 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
14170 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
14180 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
14190 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
141a0 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
141b0 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70  Blob) );.  n = p
141c0 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
141d0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
141e0 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
141f0 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  >u.nZero;.  }.  
14200 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
14210 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
14220 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
14230 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
14240 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
14250 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
14260 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
14270 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
14280 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
14290 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
142a0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
142b0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
142c0 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
142d0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
142e0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
142f0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
14300 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
14310 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
14320 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
14330 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
14340 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
14350 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
14360 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
14370 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
14380 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
14390 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
143a0 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
143b0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
143c0 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
143d0 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
143e0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
143f0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
14400 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
14410 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
14420 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
14430 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
14440 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
14450 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
14460 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
14470 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
14480 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
14490 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
144a0 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
144b0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
144c0 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
144d0 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
144e0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
144f0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
14500 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
14510 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
14520 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
14530 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
14540 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
14550 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
14560 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
14570 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
14580 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
14590 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
145a0 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
145b0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
145c0 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
145d0 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
145e0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
145f0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
14600 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
14610 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
14620 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
14630 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
14640 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
14650 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
14660 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
14670 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
14680 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
14690 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
146a0 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
146b0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
146c0 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
146d0 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
146e0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
146f0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
14700 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
14710 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
14720 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
14730 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
14740 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
14750 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
14760 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
14770 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
14780 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
14790 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
147a0 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
147b0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
147c0 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
147d0 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
147e0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
147f0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
14800 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
14810 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
14820 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
14830 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
14840 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
14850 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
14860 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
14870 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
14880 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
14890 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
148a0 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
148b0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
148c0 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
148d0 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
148e0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
148f0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
14900 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
14910 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
14920 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
14930 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
14940 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
14950 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
14960 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
14970 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
14980 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
14990 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
149a0 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
149b0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
149c0 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
149d0 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
149e0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
149f0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
14a00 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
14a10 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
14a20 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
14a30 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
14a40 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
14a50 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
14a60 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
14a70 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
14a80 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
14a90 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
14aa0 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
14ab0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
14ac0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
14ad0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
14ae0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
14af0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
14b00 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
14b10 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
14b20 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
14b30 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
14b40 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
14b50 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
14b60 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
14b70 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
14b80 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
14b90 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
14ba0 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
14bb0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14bc0 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
14bd0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
14be0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
14bf0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
14c00 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74  uf[].  nBuf must
14c10 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61   always be.** la
14c20 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
14c30 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
14c40 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  eld.  Except, if
14c50 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a   the field is.**
14c60 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a   a blob with a z
14c70 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c  ero-filled tail,
14c80 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68   then buf[] migh
14c90 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69  t be just the ri
14ca0 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68  ght.** size to h
14cb0 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65  old everything e
14cc0 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65  xcept for the ze
14cd0 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20  ro-filled tail. 
14ce0 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20   If buf[].** is 
14cf0 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20  only big enough 
14d00 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d  to hold the non-
14d10 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65  zero prefix, the
14d20 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61  n only write tha
14d30 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f  t.** prefix into
14d40 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20   buf[].  But if 
14d50 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65  buf[] is large e
14d60 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f  nough to hold bo
14d70 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  th the.** prefix
14d80 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68   and the tail th
14d90 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65  en write the pre
14da0 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20  fix and set the 
14db0 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a  tail to all.** z
14dc0 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eros..**.** Retu
14dd0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
14de0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
14df0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
14e00 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
14e10 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
14e20 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
14e30 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
14e40 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
14e50 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
14e60 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
14e70 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
14e80 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
14e90 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
14ea0 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c   *buf, int nBuf,
14eb0 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20   Mem *pMem, int 
14ec0 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
14ed0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u32 serial_type 
14ee0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14ef0 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69  ialType(pMem, fi
14f00 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33  le_format);.  u3
14f10 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  2 len;..  /* Int
14f20 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
14f30 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
14f40 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
14f50 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
14f60 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a  4 v;.    u32 i;.
14f70 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
14f80 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
14f90 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
14fa0 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
14fb0 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
14fc0 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
14fd0 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
14fe0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
14ff0 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
15000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
15010 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
15020 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
15030 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15040 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
15050 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  type);.    asser
15060 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75  t( len<=(u32)nBu
15070 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
15080 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
15090 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  [i] = (u8)(v&0xF
150a0 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
150b0 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
150c0 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
150d0 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
150e0 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
150f0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
15100 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
15110 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
15120 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
15130 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
15140 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
15150 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
15160 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
15170 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
15180 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
15190 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65  <=nBuf );.    le
151a0 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
151b0 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
151c0 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
151d0 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
151e0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
151f0 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d      len += pMem-
15200 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
15210 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20  assert( nBuf>=0 
15220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e  );.      if( len
15230 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a   > (u32)nBuf ){.
15240 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75          len = (u
15250 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d  32)nBuf;.      }
15260 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62  .      memset(&b
15270 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20  uf[pMem->n], 0, 
15280 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  len-pMem->n);.  
15290 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
152a0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
152b0 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
152c0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
152d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
152e0 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
152f0 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
15300 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
15310 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
15320 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
15330 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
15340 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
15350 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15360 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32  es read..*/ .u32
15370 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15380 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
15390 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
153a0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
153b0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
153c0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
153d0 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
153e0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
153f0 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
15400 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
15410 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
15420 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
15430 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
15440 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
15450 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
15460 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
15470 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
15480 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
15490 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
154a0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
154b0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
154c0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
154d0 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20   {  /* NULL */. 
154e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
154f0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
15500 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15510 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
15520 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
15530 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
15540 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67  pMem->u.i = (sig
15550 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b  ned char)buf[0];
15560 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15570 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15580 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15590 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
155a0 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
155b0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
155c0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
155d0 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
155e0 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
155f0 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [1];.      pMem-
15600 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15610 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
15620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15630 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
15640 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
15650 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
15660 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
15670 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20  ar)buf[0])<<16) 
15680 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20  | (buf[1]<<8) | 
15690 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[2];.      pM
156a0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
156b0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
156c0 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
156d0 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
156e0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
156f0 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
15700 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c  >u.i = (buf[0]<<
15710 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31  24) | (buf[1]<<1
15720 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29  6) | (buf[2]<<8)
15730 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20   | buf[3];.     
15740 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
15750 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
15760 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
15770 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
15780 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
15790 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36  eger */.      u6
157a0 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20  4 x = (((signed 
157b0 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
157c0 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
157d0 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d   u32 y = (buf[2]
157e0 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c  <<24) | (buf[3]<
157f0 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c  <16) | (buf[4]<<
15800 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20  8) | buf[5];.   
15810 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
15820 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   y;.      pMem->
15830 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
15840 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15850 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15860 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
15870 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
15880 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
15890 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
158a0 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
158b0 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
158c0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  nt */.      u64 
158d0 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a  x;.      u32 y;.
158e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
158f0 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
15900 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
15910 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
15920 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
15930 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
15940 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
15950 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
15960 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
15970 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
15980 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
15990 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
159a0 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  OAT is.      ** 
159b0 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
159c0 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
159d0 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
159e0 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20   are mixed.     
159f0 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
15a00 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69    */.      stati
15a10 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
15a20 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
15a30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74  0)<<32;.      st
15a40 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
15a50 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
15a60 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20    u64 t2 = t1;. 
15a70 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
15a80 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
15a90 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
15aa0 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
15ab0 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
15ac0 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
15ad0 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
15ae0 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66  ..      x = (buf
15af0 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
15b00 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
15b10 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
15b20 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34        y = (buf[4
15b30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d  ]<<24) | (buf[5]
15b40 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c  <<16) | (buf[6]<
15b50 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20  <8) | buf[7];.  
15b60 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
15b70 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73  | y;.      if( s
15b80 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
15b90 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  .        pMem->u
15ba0 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
15bb0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
15bc0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15be0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
15bf0 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
15c00 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29  of(pMem->r)==8 )
15c10 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69  ;.        swapMi
15c20 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
15c30 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
15c40 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20  y(&pMem->r, &x, 
15c50 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
15c60 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
15c70 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
15c80 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75  Mem->r) ? MEM_Nu
15c90 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
15ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
15cb0 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 8;.    }.   
15cc0 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
15cd0 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
15ce0 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
15cf0 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
15d00 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72   pMem->u.i = ser
15d10 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20  ial_type-8;.    
15d20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15d30 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
15d40 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
15d50 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
15d60 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73      u32 len = (s
15d70 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
15d80 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
15d90 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
15da0 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c       pMem->n = l
15db0 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  en;.      pMem->
15dc0 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  xDel = 0;.      
15dd0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26  if( serial_type&
15de0 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
15df0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15e00 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65  M_Str | MEM_Ephe
15e10 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
15e20 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
15e30 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c  ags = MEM_Blob |
15e40 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
15e50 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
15e60 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   len;.    }.  }.
15e70 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
15e80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15e90 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
15ea0 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
15eb0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
15ec0 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
15ed0 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
15ee0 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
15ef0 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
15f00 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
15f10 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
15f20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
15f30 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
15f40 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
15f50 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
15f60 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
15f70 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
15f80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
15f90 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
15fa0 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
15fb0 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
15fc0 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
15fd0 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
15fe0 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
15ff0 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
16000 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
16010 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
16020 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
16030 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
16040 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
16050 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
16060 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
16070 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
16080 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
16090 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
160a0 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
160b0 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
160c0 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
160d0 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
160e0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
160f0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
16100 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
16110 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
16120 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
16130 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
16140 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
16150 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
16160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
16170 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
16180 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68  e record */.  ch
16190 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20  ar *pSpace,     
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161b0 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65   Unaligned space
161c0 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
161d0 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20  int szSpace,    
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63  /* Size of pSpac
16200 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  e[] in bytes */.
16210 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20    char **ppFree 
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72    /* OUT: Caller
16240 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69   should free thi
16250 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a  s pointer */.){.
16260 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
16270 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
16280 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65    /* Unpacked re
16290 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a  cord to return *
162a0 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20  /.  int nOff;   
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
162d0 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20   pSpace by nOff 
162e0 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20  to align it */. 
162f0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16320 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
16330 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20   *p */..  /* We 
16340 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68  want to shift th
16350 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65  e pointer pSpace
16360 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74   up such that it
16370 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   is 8-byte align
16380 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77  ed..  ** Thus, w
16390 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c  e need to calcul
163a0 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66  ate a value, nOf
163b0 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  f, between 0 and
163c0 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20   7, to shift .  
163d0 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53  ** it by.  If pS
163e0 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20  pace is already 
163f0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20  8-byte aligned, 
16400 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a  nOff should be z
16410 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66  ero..  */.  nOff
16420 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f   = (8 - (SQLITE_
16430 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63  PTR_TO_INT(pSpac
16440 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20  e) & 7)) & 7;.  
16450 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
16460 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
16470 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
16480 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
16490 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28  nField+1);.  if(
164a0 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e   nByte>szSpace+n
164b0 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  Off ){.    p = (
164c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
164d0 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
164e0 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
164f0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70  , nByte);.    *p
16500 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29  pFree = (char *)
16510 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20  p;.    if( !p ) 
16520 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
16530 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  e{.    p = (Unpa
16540 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70  ckedRecord*)&pSp
16550 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a  ace[nOff];.    *
16560 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppFree = 0;.  }.
16570 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65  .  p->aMem = (Me
16580 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52  m*)&((char*)p)[R
16590 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
165a0 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a  ackedRecord))];.
165b0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
165c0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
165d0 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  0 );.  p->pKeyIn
165e0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
165f0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
16600 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
16610 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
16620 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
16630 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
16640 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
16650 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
16660 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
16670 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
16680 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
16690 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
166a0 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
166b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
166c0 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
166d0 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
166e0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
166f0 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
16700 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
16710 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
16720 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
16730 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
16740 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
16750 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
16760 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
16770 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
16780 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
16790 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
167a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
167b0 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
167c0 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
167d0 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
167e0 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
167f0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16800 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
16810 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16820 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
16830 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
16860 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
16870 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
16880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
168a0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
168b0 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
168c0 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
168d0 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
168e0 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73  >flags = 0;.  as
168f0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
16900 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
16910 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
16920 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
16930 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
16940 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
16950 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
16960 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26  & u<p->nField &&
16970 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
16980 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
16990 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
169a0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
169b0 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
169c0 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
169d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
169e0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
169f0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
16a00 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67     /* pMem->flag
16a10 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65  s = 0; // sqlite
16a20 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
16a30 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66   will set this f
16a40 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65  or us */.    pMe
16a50 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  m->zMalloc = 0;.
16a60 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
16a70 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
16a80 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
16a90 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
16aa0 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b  pMem++;.    u++;
16ab0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
16ac0 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
16ad0 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
16ae0 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a  Field = u;.}../*
16af0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16b00 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
16b10 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
16b20 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
16b30 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
16b40 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
16b50 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
16b60 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
16b70 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
16b80 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
16b90 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
16ba0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
16bb0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
16bc0 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
16bd0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
16be0 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
16bf0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
16c00 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
16c10 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
16c20 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
16c30 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
16c40 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
16c50 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
16c60 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
16c70 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
16c80 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
16c90 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
16ca0 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
16cb0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
16cc0 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
16cd0 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
16ce0 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
16cf0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
16d00 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
16d10 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
16d20 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
16d30 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
16d40 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
16d50 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
16d60 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
16d70 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
16d80 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
16d90 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
16da0 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
16db0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
16dc0 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
16dd0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
16de0 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
16df0 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
16e00 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
16e10 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
16e20 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
16e30 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
16e40 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
16e50 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
16e60 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
16e70 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
16e80 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
16e90 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
16ea0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
16eb0 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   key */.){.  int
16ec0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
16ed0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
16ee0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
16ef0 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
16f00 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
16f10 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
16f20 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
16f30 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
16f40 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
16f50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16f60 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
16f70 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
16f80 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  = 0;.  int nFiel
16f90 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
16fa0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
16fb0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
16fc0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
16fd0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
16fe0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16ff0 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
17000 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
17010 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
17020 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
17030 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
17040 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
17050 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
17060 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
17070 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
17080 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
17090 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
170a0 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
170b0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
170c0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
170d0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
170e0 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
170f0 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
17100 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
17110 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
17120 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
17130 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
17140 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
17150 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
17160 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
17170 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
17180 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
17190 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
171a0 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
171b0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
171c0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
171d0 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
171e0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
171f0 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
17200 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
17210 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
17220 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
17230 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
17240 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
17250 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
17260 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
17270 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
17280 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
17290 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
172a0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
172b0 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
172c0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
172d0 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
172e0 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
172f0 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
17300 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
17310 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
17320 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
17330 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
17340 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 61 73  fo->nField;.  as
17350 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
17360 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
17370 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
17380 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
17390 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20  2->nField ){.   
173a0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
173b0 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
173c0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
173d0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
173e0 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
173f0 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
17400 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
17410 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
17420 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69  l_type1 );.    i
17430 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20  f( d1>=nKey1 && 
17440 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17450 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
17460 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b  type1)>0 ) break
17470 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  ;..    /* Extrac
17480 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
17490 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
174a0 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
174b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
174c0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
174d0 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
174e0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
174f0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
17500 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
17510 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
17520 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
17530 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20  >aMem[i],.      
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17550 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20       i<nField ? 
17560 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
17570 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  i] : 0);.    if(
17580 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
17590 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61  assert( mem1.zMa
175a0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
175b0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
175c0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e   */..      /* In
175d0 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20  vert the result 
175e0 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  if we are using 
175f0 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e  DESC sort order.
17600 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c   */.      if( i<
17610 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e  nField && pKeyIn
17620 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
17630 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
17640 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = -rc;.      }. 
17650 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20     .      /* If 
17660 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43  the PREFIX_SEARC
17670 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  H flag is set an
17680 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63  d all fields exc
17690 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  ept the final.  
176a0 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65      ** rowid fie
176b0 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74  ld were equal, t
176c0 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52  hen clear the PR
176d0 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67  EFIX_SEARCH flag
176e0 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20   and set .      
176f0 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64  ** pPKey2->rowid
17700 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
17710 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
17720 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79   in (pKey1, nKey
17730 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  1)..      ** Thi
17740 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
17750 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63   OP_IsUnique opc
17760 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
17770 20 20 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d      if( (pPKey2-
17780 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
17790 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 29  D_PREFIX_SEARCH)
177a0 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e   && i==(pPKey2->
177b0 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20  nField-1) ){.   
177c0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
177d0 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20  1==szHdr1 && rc 
177e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
177f0 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20  t( mem1.flags & 
17800 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20  MEM_Int );.     
17810 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73     pPKey2->flags
17820 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52   &= ~UNPACKED_PR
17830 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20  EFIX_SEARCH;.   
17840 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77       pPKey2->row
17850 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20  id = mem1.u.i;. 
17860 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20       }.    .    
17870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17880 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a   }.    i++;.  }.
17890 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
178a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
178b0 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
178c0 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
178d0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
178e0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
178f0 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
17900 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
17910 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
17920 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
17930 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
17940 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
17950 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
17960 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61  assert( mem1.zMa
17970 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
17980 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
17990 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
179a0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
179b0 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
179c0 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
179d0 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
179e0 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66  t were equal. If
179f0 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e   the UNPACKED_IN
17a00 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20  CRKEY.  ** flag 
17a10 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65  is set, then bre
17a20 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74 72  ak the tie by tr
17a30 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c  eating key2 as l
17a40 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74  arger..  ** If t
17a50 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49  he UPACKED_PREFI
17a60 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20  X_MATCH flag is 
17a70 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77  set, then keys w
17a80 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  ith common prefi
17a90 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e  xes.  ** are con
17aa0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71  sidered to be eq
17ab0 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ual.  Otherwise,
17ac0 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20   the longer key 
17ad0 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72  is the .  ** lar
17ae0 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70  ger.  As it happ
17af0 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20  ens, the pPKey2 
17b00 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74  will always be t
17b10 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69  he longer.  ** i
17b20 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66  f there is a dif
17b30 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
17b40 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b  assert( rc==0 );
17b50 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  .  if( pPKey2->f
17b60 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
17b70 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72  INCRKEY ){.    r
17b80 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20  c = -1;.  }else 
17b90 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
17ba0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
17bb0 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  FIX_MATCH ){.   
17bc0 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20   /* Leave rc==0 
17bd0 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  */.  }else if( i
17be0 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20  dx1<szHdr1 ){.  
17bf0 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
17c00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a  return rc;.}. ..
17c10 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
17c20 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
17c30 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
17c40 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
17c50 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
17c60 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
17c70 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
17c80 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
17c90 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
17ca0 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
17cb0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
17cc0 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
17cd0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
17ce0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
17cf0 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f  pCur might be po
17d00 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f  inting to text o
17d10 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63  btained from a c
17d20 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
17d30 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20  file..** So the 
17d40 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62  content cannot b
17d50 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61  e trusted.  Do a
17d60 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b  ppropriate check
17d70 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  s on the content
17d80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17d90 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c  VdbeIdxRowid(sql
17da0 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73  ite3 *db, BtCurs
17db0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
17dc0 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
17dd0 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
17de0 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72   rc;.  u32 szHdr
17df0 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
17e00 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
17e10 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
17e20 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
17e30 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
17e40 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f  d */.  u32 lenRo
17e50 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  wid;     /* Size
17e60 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
17e70 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20  .  Mem m, v;..  
17e80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
17e90 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
17ea0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
17eb0 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
17ec0 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
17ed0 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
17ee0 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
17ef0 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
17f00 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
17f10 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17f20 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
17f30 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
17f40 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
17f50 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
17f60 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
17f70 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
17f80 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
17f90 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
17fa0 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
17fb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17fc0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
17fd0 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
17fe0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
17ff0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
18000 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
18010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
18020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
18030 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
18040 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
18050 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
18060 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
18070 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
18080 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
18090 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
180a0 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
180b0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
180c0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
180d0 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d  y */.  memset(&m
180e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
180f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
18100 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
18110 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43  pCur, 0, (int)nC
18120 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
18130 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
18150 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
18160 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
18170 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
18180 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
18190 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
181a0 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
181b0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
181c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
181d0 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
181e0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
181f0 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
18200 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
18210 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
18220 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
18230 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
18240 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
18250 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
18260 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
18270 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
18280 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
18290 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
182a0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
182b0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
182c0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
182d0 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
182e0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
182f0 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
18300 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
18310 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
18320 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
18330 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
18340 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
18350 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
18360 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
18370 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
18380 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
18390 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
183a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
183b0 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
183c0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
183d0 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
183e0 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
183f0 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
18400 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
18410 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
18420 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
18430 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
18440 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
18450 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
18460 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
18470 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
18480 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
18490 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
184a0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
184b0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
184c0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
184d0 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
184e0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
184f0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
18500 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
18510 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
18520 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
18530 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
18540 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
18550 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
18560 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
18570 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18580 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
18590 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
185a0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
185b0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
185c0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
185d0 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
185e0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
185f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18600 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
18610 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
18620 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
18630 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
18640 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
18650 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
18660 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18670 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
18680 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
18690 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
186a0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
186b0 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
186c0 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
186d0 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
186e0 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
186f0 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
18700 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
18710 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
18720 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
18730 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
18740 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
18750 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
18760 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
18770 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
18780 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
18790 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
187a0 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
187b0 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
187c0 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
187d0 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
187e0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
187f0 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
18800 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
18810 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
18820 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
18830 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
18840 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
18850 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
18860 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
18870 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
18880 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
18890 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
188a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
188b0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
188c0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
188d0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  C,             /
188e0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
188f0 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
18900 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
18910 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
18920 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
18930 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63  sion of key to c
18940 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
18950 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
18980 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
18990 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
189a0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
189b0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
189c0 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
189d0 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
189e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
189f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
18a00 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
18a10 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
18a20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
18a30 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
18a40 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
18a50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
18a60 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
18a70 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
18a80 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
18a90 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
18aa0 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
18ab0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
18ac0 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
18ad0 75 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20  use of the say. 
18ae0 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
18af0 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
18b00 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
18b10 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
18b20 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
18b30 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
18b40 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
18b50 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
18b60 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
18b70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18b80 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  T;.  }.  memset(
18b90 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
18ba0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18bb0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
18bc0 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
18bd0 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
18be0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
18bf0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
18c00 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
18c10 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61  ( pUnpacked->fla
18c20 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
18c30 45 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20  EFIX_MATCH );.  
18c40 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
18c50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
18c60 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
18c70 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
18c80 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
18c90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18ca0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18cb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
18cc0 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
18cd0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
18ce0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
18cf0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
18d00 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
18d10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
18d20 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
18d30 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
18d40 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
18d50 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
18d60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18d70 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
18d80 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
18d90 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
18da0 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
18db0 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
18dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
18dd0 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
18de0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
18df0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
18e00 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
18e10 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
18e20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18e30 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
18e40 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
18e50 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
18e60 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
18e70 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
18e80 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
18e90 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
18ea0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
18eb0 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
18ec0 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
18ed0 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
18ee0 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
18ef0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
18f00 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
18f10 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
18f20 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
18f30 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
18f40 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
18f50 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
18f60 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
18f70 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
18f80 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
18f90 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
18fa0 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
18fb0 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
18fc0 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
18fd0 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
18fe0 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
18ff0 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
19000 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
19010 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
19020 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
19030 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
19040 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
19050 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
19060 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
19070 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
19080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
190a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
190b0 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
190c0 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
190d0 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
190e0 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f  turn v->db;.}../
190f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
19100 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
19110 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
19120 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
19130 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
19140 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
19150 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
19160 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
19170 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
19180 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
19190 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
191a0 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
191b0 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
191c0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
191d0 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
191e0 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
191f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
19200 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
19210 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
19220 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
19230 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
19240 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
19250 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
19260 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
19270 47 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76  GetValue(Vdbe *v
19280 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61  , int iVar, u8 a
19290 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ff){.  assert( i
192a0 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76  Var>0 );.  if( v
192b0 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
192c0 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61  m = &v->aVar[iVa
192d0 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d  r-1];.    if( 0=
192e0 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  =(pMem->flags & 
192f0 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20  MEM_Null) ){.   
19300 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
19310 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
19320 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b  ValueNew(v->db);
19330 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20  .      if( pRet 
19340 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19350 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d  e3VdbeMemCopy((M
19360 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29  em *)pRet, pMem)
19370 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19380 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
19390 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53  ity(pRet, aff, S
193a0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
193b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
193c0 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65  MemStoreType((Me
193d0 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20  m *)pRet);.     
193e0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
193f0 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
19400 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
19410 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
19420 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
19430 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
19440 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
19450 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
19460 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
19470 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
19480 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
19490 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
194a0 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
194b0 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
194c0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
194d0 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
194e0 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
194f0 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
19500 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
19510 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
19520 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
19530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
19540 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
19550 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
19560 0a 20 20 7d 0a 7d 0a                             .  }.}.