/ Hex Artifact Content
Login

Artifact bdf1b3cdf97692eedd4ab4d60510531ab3019683:


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 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 32 34 20 32  eaux.c,v 1.424 2
02c0: 30 30 38 2f 31 32 2f 30 39 20 30 32 3a 35 31 3a  008/12/09 02:51:
02d0: 32 34 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  24 drh Exp $.*/.
02e0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
02f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0300: 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75  <ctype.h>.#inclu
0310: 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a  de "vdbeInt.h"..
0320: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65 62  ../*.** When deb
0330: 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65 20  ugging the code 
0340: 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20 73  generator in a s
0350: 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65 72  ymbolic debugger
0360: 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65 74  , one can.** set
0370: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
0380: 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20 31 20  AddopTrace to 1 
0390: 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  and all opcodes 
03a0: 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65 64 0a  will be printed.
03b0: 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65 20 61  ** as they are a
03c0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 73 74  dded to the inst
03d0: 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d 2e 0a  ruction stream..
03e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
03f0: 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  _DEBUG.int sqlit
0400: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
0410: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f   = 0;.#endif.../
0420: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
0430: 77 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  w virtual databa
0440: 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64  se engine..*/.Vd
0450: 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 43  be *sqlite3VdbeC
0460: 72 65 61 74 65 28 73 71 6c 69 74 65 33 20 2a 64  reate(sqlite3 *d
0470: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
0480: 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
0490: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
04a0: 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69  eof(Vdbe) );.  i
04b0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
04c0: 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62   0;.  p->db = db
04d0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
04e0: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64  e ){.    db->pVd
04f0: 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  be->pPrev = p;. 
0500: 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20   }.  p->pNext = 
0510: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e  db->pVdbe;.  p->
0520: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d  pPrev = 0;.  db-
0530: 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d  >pVdbe = p;.  p-
0540: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
0550: 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
0560: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
0570: 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20  emember the SQL 
0580: 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65  string for a pre
0590: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
05a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
05b0: 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 65 20  VdbeSetSql(Vdbe 
05c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
05d0: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28  z, int n){.  if(
05e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
05f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0600: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0610: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0620: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0630: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
0640: 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63  rn the SQL assoc
0650: 69 61 74 65 64 20 77 69 74 68 20 61 20 70 72 65  iated with a pre
0660: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
0670: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
0680: 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74  qlite3_sql(sqlit
0690: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
06a0: 0a 20 20 72 65 74 75 72 6e 20 28 28 56 64 62 65  .  return ((Vdbe
06b0: 20 2a 29 70 53 74 6d 74 29 2d 3e 7a 53 71 6c 3b   *)pStmt)->zSql;
06c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61  .}../*.** Swap a
06d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74 77 65  ll content betwe
06e0: 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74 72 75  en two VDBE stru
06f0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0700: 73 71 6c 69 74 65 33 56 64 62 65 53 77 61 70 28  sqlite3VdbeSwap(
0710: 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65 20 2a  Vdbe *pA, Vdbe *
0720: 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c  pB){.  Vdbe tmp,
0730: 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a   *pTmp;.  char *
0740: 7a 54 6d 70 3b 0a 20 20 69 6e 74 20 6e 54 6d 70  zTmp;.  int nTmp
0750: 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20  ;.  tmp = *pA;. 
0760: 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70   *pA = *pB;.  *p
0770: 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20  B = tmp;.  pTmp 
0780: 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pA->pNext;.  p
0790: 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70  A->pNext = pB->p
07a0: 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78  Next;.  pB->pNex
07b0: 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70  t = pTmp;.  pTmp
07c0: 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20   = pA->pPrev;.  
07d0: 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e  pA->pPrev = pB->
07e0: 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72  pPrev;.  pB->pPr
07f0: 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d  ev = pTmp;.  zTm
0800: 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20  p = pA->zSql;.  
0810: 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a  pA->zSql = pB->z
0820: 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20  Sql;.  pB->zSql 
0830: 3d 20 7a 54 6d 70 3b 0a 20 20 6e 54 6d 70 20 3d  = zTmp;.  nTmp =
0840: 20 70 41 2d 3e 6e 53 71 6c 3b 0a 20 20 70 41 2d   pA->nSql;.  pA-
0850: 3e 6e 53 71 6c 20 3d 20 70 42 2d 3e 6e 53 71 6c  >nSql = pB->nSql
0860: 3b 0a 20 20 70 42 2d 3e 6e 53 71 6c 20 3d 20 6e  ;.  pB->nSql = n
0870: 54 6d 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Tmp;.}..#ifdef S
0880: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0890: 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67 20 6f  * Turn tracing o
08a0: 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f 69 64  n or off.*/.void
08b0: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
08c0: 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c 45 20  e(Vdbe *p, FILE 
08d0: 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e 74 72  *trace){.  p->tr
08e0: 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d 0a 23  ace = trace;.}.#
08f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  endif../*.** Res
0900: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70  ize the Vdbe.aOp
0910: 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 69   array so that i
0920: 74 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  t is at least on
0930: 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68 61 6e  e op larger than
0940: 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a 2a 0a   .** it was..**.
0950: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
0960: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
0970: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
0980: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
0990: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
09a0: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
09b0: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
09c0: 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65  Vdbe.nOpAlloc re
09d0: 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  main .** unchang
09e0: 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74  ed (this is so t
09f0: 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73 20  hat any opcodes 
0a00: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0a10: 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72  d can be .** cor
0a20: 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74  rectly deallocat
0a30: 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
0a40: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56 64  e rest of the Vd
0a50: 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  be)..*/.static i
0a60: 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28 56  nt growOpArray(V
0a70: 64 62 65 20 2a 70 29 7b 0a 20 20 56 64 62 65 4f  dbe *p){.  VdbeO
0a80: 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  p *pNew;.  int n
0a90: 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c  New = (p->nOpAll
0aa0: 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  oc ? p->nOpAlloc
0ab0: 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f  *2 : (int)(1024/
0ac0: 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20  sizeof(Op)));.  
0ad0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
0ae0: 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70  Realloc(p->db, p
0af0: 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a 65  ->aOp, nNew*size
0b00: 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20 70  of(Op));.  if( p
0b10: 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f  New ){.    p->nO
0b20: 70 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  pAlloc = nNew;. 
0b30: 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     p->aOp = pNew
0b40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0b50: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0b60: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   : SQLITE_NOMEM)
0b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
0b80: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
0b90: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
0ba0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72  instructions cur
0bb0: 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56  rent in the.** V
0bc0: 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65  DBE.  Return the
0bd0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
0be0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
0bf0: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
0c00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20  s:.**.**    p   
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e              Poin
0c20: 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a  ter to the VDBE.
0c30: 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20  **.**    op     
0c40: 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63           The opc
0c50: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73  ode for this ins
0c60: 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  truction.**.**  
0c70: 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20    p1, p2, p3    
0c80: 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a    Operands.**.**
0c90: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
0ca0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
0cb0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0cc0: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0cd0: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0ce0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66  VdbeChangeP4() f
0cf0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0d00: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0d10: 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P4.** operand
0d20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d30: 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65 20  VdbeAddOp3(Vdbe 
0d40: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0d50: 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20  p1, int p2, int 
0d60: 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p3){.  int i;.  
0d70: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
0d80: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73  i = p->nOp;.  as
0d90: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
0da0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
0db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e  );.  assert( op>
0dc0: 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a  0 && op<0xff );.
0dd0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0de0: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
0df0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
0e00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
0e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
0e20: 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20  >nOp++;.  pOp = 
0e30: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
0e40: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29  p->opcode = (u8)
0e50: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20  op;.  pOp->p5 = 
0e60: 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70  0;.  pOp->p1 = p
0e70: 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70  1;.  pOp->p2 = p
0e80: 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70  2;.  pOp->p3 = p
0e90: 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  3;.  pOp->p4.p =
0ea0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70   0;.  pOp->p4typ
0eb0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
0ec0: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
0ed0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
0ee0: 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f  DEBUG.  pOp->zCo
0ef0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  mment = 0;.  if(
0f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
0f10: 70 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  pTrace ) sqlite3
0f20: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
0f30: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
0f40: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
0f50: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
0f60: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
0f70: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
0f80: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
0f90: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
0fa0: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
0fb0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
0fc0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
0fd0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
0fe0: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
0ff0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1000: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1010: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
1020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1030: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
1040: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1050: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1060: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1070: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1080: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1090: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
10a0: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
10b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
10c0: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
10d0: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
10e0: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
10f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1100: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
1110: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1120: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
1130: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
1140: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1150: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
1160: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
1170: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
1180: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
1190: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
11a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11b0: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
11c0: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
11d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
11e0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
11f0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
1200: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
1210: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
1220: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
1230: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
1240: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1260: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1270: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1280: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1290: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
12a0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
12b0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
12c0: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
12d0: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
12e0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
12f0: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
1300: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
1310: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
1320: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
1330: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
1340: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
1350: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
1360: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
1370: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
1380: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
1390: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
13a0: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
13b0: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
13c0: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
13d0: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
13e0: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
13f0: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
1400: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
1410: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
1420: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
1430: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
1440: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
1450: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
1460: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
1470: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
1480: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
1490: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
14a0: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
14b0: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
14c0: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
14d0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
14e0: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
14f0: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
1500: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
1510: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
1520: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1530: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
1540: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
1550: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  ){.  int i;.  i 
1560: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
1570: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1580: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1590: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
15a0: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b  ->nLabelAlloc ){
15b0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e  .    int n = p->
15c0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20  nLabelAlloc*2 + 
15d0: 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  5;.    p->aLabel
15e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
15f0: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
1600: 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20   p->aLabel,.    
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61     n*sizeof(p->a
1640: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  Label[0]));.    
1650: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
1660: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1670: 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Size(p->db, p->a
1680: 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d  Label)/sizeof(p-
1690: 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d  >aLabel[0]);.  }
16a0: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
16b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
16c0: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
16d0: 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a   return -1-i;.}.
16e0: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
16f0: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
1700: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
1710: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
1720: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
1730: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
1740: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
1750: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1760: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
1770: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1780: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
1790: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17a0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29  (Vdbe *p, int x)
17c0: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78  {.  int j = -1-x
17d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
17e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
17f0: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1800: 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e  t( j>=0 && j<p->
1810: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20  nLabel );.  if( 
1820: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1830: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
1840: 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->nOp;.  }.}../
1850: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
1860: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
1870: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
1880: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
1890: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
18a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
18b0: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
18c0: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
18d0: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
18e0: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
18f0: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
1900: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
1910: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
1920: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1930: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
1940: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
1950: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
1960: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
1970: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
1980: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
1990: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
19a0: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
19b0: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
19c0: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
19d0: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
19e0: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
19f0: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
1a00: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
1a10: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
1a20: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
1a30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a40: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68 65  ne also does the
1a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6d   following optim
1a60: 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63 61  ization:  It sca
1a70: 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73 74 72 75  ns for.** instru
1a80: 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ctions that migh
1a90: 74 20 63 61 75 73 65 20 61 20 73 74 61 74 65 6d  t cause a statem
1aa0: 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53  ent rollback.  S
1ab0: 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  uch instructions
1ac0: 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** are:.**.**  
1ad0: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
1ae0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
1af0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
1b00: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
1b10: 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a  P_Destroy.**   *
1b20: 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20    OP_VUpdate.** 
1b30: 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a    *  OP_VRename.
1b40: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 63 68  **.** If no such
1b50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
1b60: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76 65 72  found, then ever
1b70: 79 20 53 74 61 74 65 6d 65 6e 74 20 69 6e 73 74  y Statement inst
1b80: 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 63  ruction .** is c
1b90: 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f 70  hanged to a Noop
1ba0: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
1bb0: 77 65 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e  we avoid creatin
1bc0: 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
1bd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1be0: 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e 0a   unnecessarily..
1bf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1c00: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
1c10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
1c20: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
1c30: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
1c40: 72 67 73 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  rgs = 0;.  Op *p
1c50: 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  Op;.  int *aLabe
1c60: 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20  l = p->aLabel;. 
1c70: 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d 65   int doesStateme
1c80: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ntRollback = 0;.
1c90: 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d 65    int hasStateme
1ca0: 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 70  ntBegin = 0;.  p
1cb0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
1cc0: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
1cd0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 66 6f 72 28  rnal = 0;.  for(
1ce0: 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d  pOp=p->aOp, i=p-
1cf0: 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  >nOp-1; i>=0; i-
1d00: 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75  -, pOp++){.    u
1d10: 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  8 opcode = pOp->
1d20: 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28  opcode;..    if(
1d30: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63   opcode==OP_Func
1d40: 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  tion || opcode==
1d50: 4f 50 5f 41 67 67 53 74 65 70 20 29 7b 0a 20 20  OP_AggStep ){.  
1d60: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e      if( pOp->p5>
1d70: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1d80: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 23  rgs = pOp->p5;.#
1d90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1da0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1db0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1dc0: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
1dd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1de0: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
1df0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
1e00: 3e 70 32 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  >p2;.#endif.    
1e10: 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  }.    if( opcode
1e20: 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20  ==OP_Halt ){.   
1e30: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d     if( pOp->p1==
1e40: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1e50: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
1e60: 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
1e70: 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52    doesStatementR
1e80: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
1e90: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1ea0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74  f( opcode==OP_St
1eb0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
1ec0: 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67   hasStatementBeg
1ed0: 69 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  in = 1;.      p-
1ee0: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
1ef0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
1f00: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
1f10: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
1f20: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
1f30: 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 7d  lback = 1;.    }
1f40: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1f50: 3d 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20  =OP_Transaction 
1f60: 26 26 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 7b  && pOp->p2!=0 ){
1f70: 0a 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e  .      p->readOn
1f80: 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ly = 0;.#ifndef 
1f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1fa0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
1fb0: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
1fc0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
1fd0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
1fe0: 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61  ){.      doesSta
1ff0: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d  tementRollback =
2000: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
2010: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69  ( opcode==OP_VFi
2020: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  lter ){.      in
2030: 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t n;.      asser
2040: 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d  t( p->nOp - i >=
2050: 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65   3 );.      asse
2060: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
2070: 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29  de==OP_Integer )
2080: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b  ;.      n = pOp[
2090: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66  -1].p1;.      if
20a0: 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  ( n>nMaxArgs ) n
20b0: 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e  MaxArgs = n;.#en
20c0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  dif.    }..    i
20d0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  f( sqlite3VdbeOp
20e0: 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79 28  codeHasProperty(
20f0: 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55  opcode, OPFLG_JU
2100: 4d 50 29 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  MP) && pOp->p2<0
2110: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2120: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
2130: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
2140: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
2150: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
2160: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2170: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
2180: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
2190: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
21a0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
21b0: 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f 2a 20 49  MaxArgs;..  /* I
21c0: 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62  f we never rollb
21d0: 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ack a statement 
21e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
21f0: 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  n statement.  **
2200: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
2210: 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53  e not needed.  S
2220: 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f  o change every O
2230: 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  P_Statement.  **
2240: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20   opcode into an 
2250: 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61  OP_Noop.  This a
2260: 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73  void a call to s
2270: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
2280: 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69  usive().  ** whi
2290: 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73  ch can be expens
22a0: 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74  ive on some plat
22b0: 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  forms..  */.  if
22c0: 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  ( hasStatementBe
22d0: 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74  gin && !doesStat
22e0: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b  ementRollback ){
22f0: 0a 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  .    p->usesStmt
2300: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
2310: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
2320: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
2330: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
2340: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
2350: 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d  pcode==OP_Statem
2360: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ent ){.        p
2370: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
2380: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Noop;.      }.  
2390: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
23a0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
23b0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
23c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
23d0: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
23e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
23f0: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
2400: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
2410: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2420: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
2430: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
2440: 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65  *.** Add a whole
2450: 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69   list of operati
2460: 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ons to the opera
2470: 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74  tion stack.  Ret
2480: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65  urn the.** addre
2490: 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ss of the first 
24a0: 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e  operation added.
24b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
24c0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62  dbeAddOpList(Vdb
24d0: 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56  e *p, int nOp, V
24e0: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
24f0: 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64  *aOp){.  int add
2500: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  r;.  assert( p->
2510: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2520: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2530: 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70  p->nOp + nOp > p
2540: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
2550: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
2560: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2570: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
2580: 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 20 29  p;.  if( nOp>0 )
2590: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
25a0: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
25b0: 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20  t *pIn = aOp;.  
25c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
25d0: 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20  ; i++, pIn++){. 
25e0: 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49       int p2 = pI
25f0: 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62  n->p2;.      Vdb
2600: 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e  eOp *pOut = &p->
2610: 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20  aOp[i+addr];.   
2620: 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20     pOut->opcode 
2630: 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pIn->opcode;. 
2640: 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20       pOut->p1 = 
2650: 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69  pIn->p1;.      i
2660: 66 28 20 70 32 3c 30 20 26 26 20 73 71 6c 69 74  f( p2<0 && sqlit
2670: 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50  e3VdbeOpcodeHasP
2680: 72 6f 70 65 72 74 79 28 70 4f 75 74 2d 3e 6f 70  roperty(pOut->op
2690: 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50  code, OPFLG_JUMP
26a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75  ) ){.        pOu
26b0: 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 41  t->p2 = addr + A
26c0: 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20 7d  DDR(p2);.      }
26d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f  else{.        pO
26e0: 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20  ut->p2 = p2;.   
26f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d     }.      pOut-
2700: 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20  >p3 = pIn->p3;. 
2710: 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70       pOut->p4typ
2720: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
2730: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70        pOut->p4.p
2740: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74   = 0;.      pOut
2750: 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66  ->p5 = 0;.#ifdef
2760: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2770: 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65      pOut->zComme
2780: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  nt = 0;.      if
2790: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ( sqlite3VdbeAdd
27a0: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
27b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
27c0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
27d0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
27e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
27f0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  f.    }.    p->n
2800: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20  Op += nOp;.  }. 
2810: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
2820: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2830: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2840: 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  1 operand for a 
2850: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2860: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
2870: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2880: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
2890: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
28a0: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
28b0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
28c0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
28d0: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
28e0: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
28f0: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
2900: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  he program..*/.v
2910: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2920: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
2930: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
2940: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2950: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2960: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2970: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2980: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2990: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
29a0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
29b0: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
29c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
29d0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
29e0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
29f0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
2a00: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
2a10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2a20: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
2a30: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
2a40: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2a50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2a60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2a70: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2a80: 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
2a90: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2aa0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2ab0: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
2ac0: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
2ad0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
2ae0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
2af0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2b00: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2b10: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
2b20: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2b30: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2b40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2b50: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
2b60: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2b70: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2b80: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
2b90: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2ba0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2bb0: 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20  p && addr>=0 && 
2bc0: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70  p->nOp>addr && p
2bd0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->aOp ){.    p->
2be0: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76  aOp[addr].p3 = v
2bf0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
2c00: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2c10: 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72  e of the P5 oper
2c20: 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  and for the most
2c30: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64   recently.** add
2c40: 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ed operation..*/
2c50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2c60: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
2c70: 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73  p, u8 val){.  as
2c80: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
2c90: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2ca0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
2cb0: 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a   p && p->aOp ){.
2cc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2cd0: 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61  Op>0 );.    p->a
2ce0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
2cf0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2d00: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
2d10: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
2d20: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
2d30: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2d40: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
2d50: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2d60: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
2d70: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
2d80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d90: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
2da0: 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  addr){.  sqlite3
2db0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
2dc0: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
2dd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
2de0: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
2df0: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
2e00: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
2e10: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
2e20: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
2e30: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
2e40: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
2e50: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
2e60: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71  meralFunction(sq
2e70: 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44  lite3 *db, FuncD
2e80: 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28  ef *pDef){.  if(
2e90: 20 70 44 65 66 20 26 26 20 28 70 44 65 66 2d 3e   pDef && (pDef->
2ea0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
2eb0: 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b  UNC_EPHEM)!=0 ){
2ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2ed0: 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20  ee(db, pDef);.  
2ee0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
2ef0: 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20  e a P4 value if 
2f00: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74  necessary..*/.st
2f10: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34  atic void freeP4
2f20: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2f30: 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a  t p4type, void *
2f40: 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b  p4){.  if( p4 ){
2f50: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
2f60: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
2f70: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
2f80: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
2f90: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
2fa0: 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63 61 73  RINTF:.      cas
2fb0: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
2fc0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
2fd0: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
2fe0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 0a 20 20 20  P4_INTARRAY:.   
2ff0: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
3000: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
3010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3020: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
3030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3040: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
3050: 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20  4_VDBEFUNC: {.  
3060: 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a        VdbeFunc *
3070: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
3080: 65 46 75 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20  eFunc *)p4;.    
3090: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
30a0: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56  lFunction(db, pV
30b0: 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b  dbeFunc->pFunc);
30c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30d0: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
30e0: 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b  a(pVdbeFunc, 0);
30f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3100: 44 62 46 72 65 65 28 64 62 2c 20 70 56 64 62 65  DbFree(db, pVdbe
3110: 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62  Func);.        b
3120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3130: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
3140: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66  DEF: {.        f
3150: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
3160: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
3170: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  f*)p4);.        
3180: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3190: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d       case P4_MEM
31a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
31b0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
31c0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
31d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
31e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31f0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   }.}.../*.** Cha
3200: 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74  nge N opcodes st
3210: 61 72 74 69 6e 67 20 61 74 20 61 64 64 72 20 74  arting at addr t
3220: 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69  o No-ops..*/.voi
3230: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3240: 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a  ngeToNoop(Vdbe *
3250: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3260: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
3270: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64  p->aOp ){.    Vd
3280: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
3290: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73  aOp[addr];.    s
32a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
32b0: 64 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e  db;.    while( N
32c0: 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  -- ){.      free
32d0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
32e0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
32f0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70        memset(pOp
3300: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
3310: 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  0]));.      pOp-
3320: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
3330: 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a  p;.      pOp++;.
3340: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3350: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3360: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
3370: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
3380: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
3390: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
33a0: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
33b0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
33c0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
33d0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
33e0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
33f0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
3400: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
3410: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
3420: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
3430: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
3440: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
3450: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
3460: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
3470: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
3480: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
3490: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
34a0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
34b0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
34c0: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
34d0: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
34e0: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
34f0: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
3500: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
3510: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
3520: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
3530: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20  s of zP4..**.** 
3540: 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  If n==P4_KEYINFO
3550: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a   it means that z
3560: 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
3570: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
3580: 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70  ucture..** A cop
3590: 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
35a0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
35b0: 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  re into memory o
35c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
35d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20  sqlite3_malloc, 
35e0: 74 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e  to be freed when
35f0: 20 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e   the Vdbe is fin
3600: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34  alized..** n==P4
3610: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3620: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
3630: 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  zP4 points to a 
3640: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3650: 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d  e.** stored in m
3660: 65 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63  emory that the c
3670: 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e  aller has obtain
3680: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
3690: 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20  malloc. The .** 
36a0: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f  caller should no
36b0: 74 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63  t free the alloc
36c0: 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ation, it will b
36d0: 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65  e freed when the
36e0: 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61   Vdbe is.** fina
36f0: 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74  lized..** .** Ot
3700: 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20  her values of n 
3710: 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43  (P4_STATIC, P4_C
3720: 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64  OLLSEQ etc.) ind
3730: 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70  icate that zP4 p
3740: 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74  oints.** to a st
3750: 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72  ring or structur
3760: 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e  e that is guaran
3770: 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f  teed to exist fo
3780: 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  r the lifetime o
3790: 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49  f.** the Vdbe. I
37a0: 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65  n these cases we
37b0: 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74   can just copy t
37c0: 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  he pointer..**.*
37d0: 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e  * If addr<0 then
37e0: 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68   change P4 on th
37f0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3800: 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63  inserted instruc
3810: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3820: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3830: 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  4(Vdbe *p, int a
3840: 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ddr, const char 
3850: 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *zP4, int n){.  
3860: 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74  Op *pOp;.  sqlit
3870: 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74  e3 *db;.  assert
3880: 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
3890: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
38a0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
38b0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
38c0: 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c   if( p->aOp==0 |
38d0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
38e0: 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20  ed ){.    if (n 
38f0: 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b  != P4_KEYINFO) {
3900: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
3910: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
3920: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
3930: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
3940: 7d 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  }.  assert( addr
3950: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28  <p->nOp );.  if(
3960: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61   addr<0 ){.    a
3970: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
3980: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30  ;.    if( addr<0
3990: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
39a0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
39b0: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64  ddr];.  freeP4(d
39c0: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
39d0: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f  pOp->p4.p);.  pO
39e0: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69  p->p4.p = 0;.  i
39f0: 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29  f( n==P4_INT32 )
3a00: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74  {.    /* Note: t
3a10: 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65  his cast is safe
3a20: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72  , because the or
3a30: 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20  igin data point 
3a40: 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a  was an int.    *
3a50: 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20  * that was cast 
3a60: 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72  to a (const char
3a70: 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d   *). */.    pOp-
3a80: 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50  >p4.i = SQLITE_P
3a90: 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a  TR_TO_INT(zP4);.
3aa0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3ab0: 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65  = P4_INT32;.  }e
3ac0: 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29  lse if( zP4==0 )
3ad0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
3ae0: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
3af0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3b00: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  D;.  }else if( n
3b10: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a  ==P4_KEYINFO ){.
3b20: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
3b30: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e  yInfo;.    int n
3b40: 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20  Field, nByte;.. 
3b50: 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65     nField = ((Ke
3b60: 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69  yInfo*)zP4)->nFi
3b70: 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  eld;.    nByte =
3b80: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
3b90: 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a  o) + (nField-1)*
3ba0: 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d  sizeof(pKeyInfo-
3bb0: 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69  >aColl[0]) + nFi
3bc0: 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  eld;.    pKeyInf
3bd0: 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o = sqlite3Mallo
3be0: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  c( nByte );.    
3bf0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
3c00: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20   = pKeyInfo;.   
3c10: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
3c20: 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74  .      u8 *aSort
3c30: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
3c40: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
3c50: 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  4, nByte);.     
3c60: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
3c70: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3c80: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
3c90: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
3ca0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
3cb0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
3cc0: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
3cd0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
3ce0: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
3cf0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
3d00: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
3d10: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
3d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
3d30: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
3d40: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
3d50: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
3d60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3d70: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3d80: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3d90: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
3da0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
3db0: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
3dc0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
3dd0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
3de0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
3df0: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
3e00: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
3e10: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
3e20: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
3e30: 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63  type = (signed c
3e40: 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  har)n;.  }else{.
3e50: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
3e60: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
3e70: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
3e80: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
3e90: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
3ea0: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
3eb0: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
3ec0: 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  IC;.  }.}..#ifnd
3ed0: 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
3ee0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
3ef0: 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f  nt on the the mo
3f00: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
3f10: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
3f20: 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e  Or.** insert a N
3f30: 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65  o-op and add the
3f40: 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74   comment to that
3f50: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
3f60: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73  .  This.** makes
3f70: 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72   the code easier
3f80: 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20   to read during 
3f90: 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65  debugging.  None
3fa0: 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   of this happens
3fb0: 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74  .** in a product
3fc0: 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f  ion build..*/.vo
3fd0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
3fe0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
3ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
4000: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
4010: 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74  ist ap;.  assert
4020: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
4030: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
4040: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
4050: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
4060: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
4070: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
4080: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
4090: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61  ->nOp ){.    cha
40a0: 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70  r **pz = &p->aOp
40b0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
40c0: 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  ent;.    va_star
40d0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
40e0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
40f0: 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20  e(p->db, *pz);. 
4100: 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33     *pz = sqlite3
4110: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
4120: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
4130: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
4140: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
4150: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
4160: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
4170: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
4180: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
4190: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
41a0: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
41b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
41c0: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
41d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
41e0: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
41f0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
4200: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
4210: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4220: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
4230: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
4240: 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  z = &p->aOp[p->n
4250: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a  Op-1].zComment;.
4260: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
4270: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73   zFormat);.    s
4280: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
4290: 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70  db, *pz);.    *p
42a0: 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  z = sqlite3VMPri
42b0: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
42c0: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
42d0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
42e0: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
42f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
4300: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
4310: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
4320: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
4330: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
4340: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
4350: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
4360: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4370: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
4380: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
4390: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
43a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
43b0: 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ed );.  return (
43c0: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
43d0: 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f  <p->nOp)?(&p->aO
43e0: 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a  p[addr]):0);.}..
43f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4400: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
4410: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
4420: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
4430: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
4440: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
4450: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
4460: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
4470: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
4480: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
4490: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
44a0: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
44b0: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
44c0: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
44d0: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
44e0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
44f0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
4500: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
4510: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
4520: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
4530: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
4540: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
4550: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
4560: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
4570: 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65  STATIC:.    case
4580: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
4590: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
45a0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
45b0: 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
45c0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  .pKeyInfo;.     
45d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
45e0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
45f0: 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b  "keyinfo(%d", pK
4600: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
4610: 0a 20 20 20 20 20 20 69 20 3d 20 28 69 6e 74 29  .      i = (int)
4620: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20  strlen(zTemp);. 
4630: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4640: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4650: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4660: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
4670: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
4680: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
4690: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
46a0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
46b0: 29 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a  )strlen(pColl->z
46c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
46d0: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36   if( i+n>nTemp-6
46e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
46f0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
4700: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
4710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4720: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4730: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4740: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20  = ',';.         
4750: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
4760: 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65  SortOrder && pKe
4770: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4780: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
4790: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
47a0: 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '-';.          
47b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
47c0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43  py(&zTemp[i], pC
47d0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b  oll->zName,n+1);
47e0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
47f0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
4800: 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36   if( i+4<nTemp-6
4810: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
4820: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
4830: 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,nil",4);.      
4840: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
4850: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4860: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
4870: 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d   ')';.      zTem
4880: 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[i] = 0;.      
4890: 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20  assert( i<nTemp 
48a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
48b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
48c0: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
48d0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
48e0: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
48f0: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
4900: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4910: 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71   zTemp, "collseq
4920: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
4930: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
4940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4950: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
4960: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
4970: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
4980: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
4990: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
49a0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
49b0: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
49c0: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
49d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
49f0: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
4a00: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4a10: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4a20: 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  lld", *pOp->p4.p
4a30: 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  I64);.      brea
4a40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4a50: 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20  e P4_INT32: {.  
4a60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4a70: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4a80: 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34  p, "%d", pOp->p4
4a90: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
4aa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4ab0: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
4ac0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4ad0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4ae0: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
4af0: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
4b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4b10: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
4b20: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
4b30: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
4b40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
4b50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4b60: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20  M_Null)==0 );.  
4b70: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
4b80: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
4b90: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
4ba0: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
4bb0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
4bc0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
4bd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4be0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4bf0: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
4c00: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
4c10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
4c20: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
4c30: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
4c40: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4c50: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
4c60: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
4c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4c80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
4c90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
4ca0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
4cb0: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
4cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
4cd0: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
4ce0: 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 20 20 20  >p4.pVtab;.     
4cf0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4d00: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4d10: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
4d20: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
4d30: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
4d40: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4d50: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4d60: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
4d70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4d80: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
4d90: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
4da0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4db0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4dc0: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
4dd0: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
4de0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
4df0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
4e00: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
4e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4e20: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
4e30: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
4e40: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
4e50: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
4e60: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
4e70: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
4e80: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
4e90: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69   used..**.*/.voi
4ea0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
4eb0: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
4ec0: 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61  int i){.  int ma
4ed0: 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  sk;.  assert( i>
4ee0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
4ef0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
4f00: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
4f10: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
4f20: 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a  .  mask = 1<<i;.
4f30: 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d    if( (p->btreeM
4f40: 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
4f50: 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61  {.    p->btreeMa
4f60: 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
4f70: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
4f80: 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d  xArrayInsert(&p-
4f90: 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e  >aMutex, p->db->
4fa0: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d  aDb[i].pBt);.  }
4fb0: 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .}...#if defined
4fc0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
4fd0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
4fe0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
4ff0: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
5000: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
5010: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
5020: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
5030: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5040: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
5050: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
5060: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
5070: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
5080: 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  [50];.  static c
5090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
50a0: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
50b0: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34   %4d %4d %4d %-4
50c0: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20  s %.2X %s\n";.  
50d0: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f  if( pOut==0 ) pO
50e0: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a  ut = stdout;.  z
50f0: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
5100: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66  Op, zPtr, sizeof
5110: 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e  (zPtr));.  fprin
5120: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
5130: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
5140: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
5150: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
5160: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
5170: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
5180: 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51  p->p5,.#ifdef SQ
5190: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
51a0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f   pOp->zComment ?
51b0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a   pOp->zComment :
51c0: 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   "".#else.      
51d0: 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  "".#endif.  );. 
51e0: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
51f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
5200: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
5210: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
5220: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
5230: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
5240: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
5250: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
5260: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a  .    Mem *pEnd;.
5270: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
5280: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
5290: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
52a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
52b0: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26  ;.    for(pEnd=&
52c0: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
52d0: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
52e0: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
52f0: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
5300: 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  .db );..      /*
5310: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
5320: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
5330: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
5340: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
5350: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
5360: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
5370: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
5380: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
5390: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
53a0: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
53b0: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
53c0: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
53d0: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
53e0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
53f0: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
5400: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
5410: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
5420: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
5430: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
5440: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
5450: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
5460: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
5470: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
5480: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
5490: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
54a0: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
54b0: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
54c0: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
54d0: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
54e0: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
54f0: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
5500: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
5510: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
5520: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
5530: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
5540: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
5550: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
5560: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
5570: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
5580: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
5590: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
55a0: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
55b0: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
55c0: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
55d0: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
55e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
55f0: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
5600: 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dyn) ){.        
5610: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
5620: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
5630: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61  }else if( p->zMa
5640: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
5650: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5660: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
5670: 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f         p->zMallo
5680: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  c = 0;.      }..
5690: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
56a0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d   MEM_Null;.    }
56b0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
56c0: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
56d0: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  ailed;.  }.}..#i
56e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
56f0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
5700: 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  MENT.int sqlite3
5710: 56 64 62 65 52 65 6c 65 61 73 65 42 75 66 66 65  VdbeReleaseBuffe
5720: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
5730: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6e 46 72  nt ii;.  int nFr
5740: 65 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ee = 0;.  assert
5750: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5760: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
5770: 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 31  x) );.  for(ii=1
5780: 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  ; ii<=p->nMem; i
5790: 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70  i++){.    Mem *p
57a0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69  Mem = &p->aMem[i
57b0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d  i];.    if( pMem
57c0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
57d0: 77 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71  wSet ){.      sq
57e0: 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72  lite3RowSetClear
57f0: 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74  (pMem->u.pRowSet
5800: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5810: 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65 6d   pMem->z && pMem
5820: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20  ->flags&MEM_Dyn 
5830: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5840: 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b 0a   !pMem->xDel );.
5850: 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73        nFree += s
5860: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
5870: 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65  ze(pMem->db, pMe
5880: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  m->z);.      sql
5890: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
58a0: 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  se(pMem);.    }.
58b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 46 72    }.  return nFr
58c0: 65 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ee;.}.#endif..#i
58d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
58e0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
58f0: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
5900: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
5910: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
5920: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
5930: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
5940: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
5950: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
5960: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
5970: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
5980: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
5990: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
59a0: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
59b0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
59c0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
59d0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
59e0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
59f0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
5a00: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
5a10: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
5a20: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
5a30: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
5a40: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
5a50: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
5a60: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
5a70: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
5a80: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
5a90: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
5aa0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
5ab0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
5ac0: 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  N..*/.int sqlite
5ad0: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
5ae0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
5af0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
5b00: 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  BE */.){.  sqlit
5b10: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
5b20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
5b30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5b40: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
5b50: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d  pResultSet = &p-
5b60: 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73  >aMem[1];..  ass
5b70: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
5b80: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
5b90: 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
5ba0: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
5bb0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73 65  E_MISUSE;.  asse
5bc0: 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d 53  rt( db->magic==S
5bd0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
5be0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
5bf0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
5c00: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
5c10: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
5c20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
5c30: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
5c40: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
5c50: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
5c60: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
5c70: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
5c80: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
5c90: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
5ca0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
5cb0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
5cc0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
5cd0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
5ce0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
5cf0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
5d00: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
5d10: 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  y(pMem, p->nMem)
5d20: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
5d30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
5d40: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
5d50: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
5d60: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
5d70: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
5d80: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
5d90: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
5da0: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
5db0: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
5dc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
5dd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5de0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
5df0: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
5e00: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
5e10: 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e 65  i<p->nOp && p->e
5e20: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
5e30: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
5e40: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
5e50: 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a  f( i>=p->nOp ){.
5e60: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
5e70: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
5e80: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
5e90: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
5ea0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
5eb0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
5ec0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
5ed0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5ee0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
5ef0: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
5f00: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22  ErrMsg, db, "%s"
5f10: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
5f20: 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  p->rc));.  }else
5f30: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
5f40: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d     Op *pOp = &p-
5f50: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aOp[i];.    if(
5f60: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
5f70: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
5f80: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
5f90: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5fa0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5fb0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
5fc0: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20  i = i;          
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d        /* Program
5ff0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
6000: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20    pMem++;.  .   
6010: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
6020: 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f   MEM_Static|MEM_
6030: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
6040: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
6050: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
6060: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
6070: 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20  de);  /* Opcode 
6080: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
6090: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
60a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28       pMem->n = (
60b0: 69 6e 74 29 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  int)strlen(pMem-
60c0: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
60d0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
60e0: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
60f0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
6100: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
6110: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  ;.    }..    pMe
6120: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
6130: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
6140: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6160: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
6170: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
6180: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
6190: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
61a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
61b0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
61c0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
61f0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
6200: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
6210: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
6220: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
6230: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
6240: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
6250: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
6260: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
6270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
6290: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
62a0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
62b0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
62c0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
62d0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
62e0: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
62f0: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
6300: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
6310: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6320: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
6330: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6340: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
6350: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
6360: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
6370: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
6380: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
6390: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
63a0: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
63b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
63c0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
63d0: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
63e0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
63f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
6400: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
6410: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
6420: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 4d  = (int)strlen(pM
6430: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
6440: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
6450: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
6460: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
6470: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
6480: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
6490: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
64a0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
64b0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
64c0: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
64d0: 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c       p->db->mall
64e0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
64f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6500: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6510: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
6520: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
6530: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
6540: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
6550: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
6560: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d  3_snprintf(3, pM
6570: 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70  em->z, "%.2x", p
6580: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
6590: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
65a0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
65b0: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
65c0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
65d0: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
65e0: 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .  .#ifdef SQLIT
65f0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
6600: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
6610: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
6620: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
6630: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
6640: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
6650: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
6660: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 69      pMem->n = (i
6670: 6e 74 29 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e  nt)strlen(pMem->
6680: 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  z);.        pMem
6690: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
66a0: 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  TF8;.        pMe
66b0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
66c0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _TEXT;.      }el
66d0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
66e0: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
66f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
6700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6710: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
6720: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  nt */.        pM
6730: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
6740: 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_NULL;.      }.
6750: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52      }..    p->nR
6760: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 35  esColumn = 8 - 5
6770: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
6780: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
6790: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
67a0: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d   SQLITE_ROW;.  }
67b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
67c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
67d0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
67e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
67f0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
6800: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
6810: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
6820: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
6830: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
6840: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
6850: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6860: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
6870: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
6880: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
6890: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
68a0: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
68b0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
68c0: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
68d0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
68e0: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
68f0: 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  4.z;.    while( 
6900: 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29  isspace(*(u8*)z)
6910: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
6920: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
6930: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
6940: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
6950: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
6960: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
6970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
6980: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
6990: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
69a0: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
69b0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
69c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
69d0: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
69e0: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
69f0: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
6a00: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
6a10: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
6a20: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
6a30: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
6a40: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
6a50: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
6a60: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
6a70: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
6a80: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
6a90: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
6aa0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6ab0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
6ac0: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
6ad0: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
6ae0: 3b 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ; isspace((unsig
6af0: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b 20  ned char)z[i]); 
6b00: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
6b10: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
6b20: 20 20 20 20 20 20 69 66 28 20 69 73 73 70 61 63        if( isspac
6b30: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
6b40: 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  )z[i]) ){.      
6b50: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
6b60: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
6b70: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
6b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6b90: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
6ba0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
6bb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
6bc0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
6bd0: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
6be0: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
6bf0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
6c00: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
6c10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
6c20: 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  TRACE */.../*.**
6c30: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
6c40: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
6c50: 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20  xecution.  This 
6c60: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
6c70: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
6c80: 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63  ating stack spac
6c90: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  e and initializi
6ca0: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
6cb0: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
6cc0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
6cd0: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
6ce0: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
6cf0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
6d00: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
6d10: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
6d20: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f  ** This is the o
6d30: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
6d40: 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45  a VDBE from VDBE
6d50: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a  _MAGIC_INIT to.*
6d60: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  * VDBE_MAGIC_RUN
6d70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6d80: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
6d90: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
6dc0: 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20    int nVar,     
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f   /* Number of '?
6df0: 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c  ' see in the SQL
6e00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6e10: 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20  int nMem,       
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6e30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  * Number of memo
6e40: 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f  ry cells to allo
6e50: 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  cate */.  int nC
6e60: 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20  ursor,          
6e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6e80: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f  er of cursors to
6e90: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
6ea0: 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20  nt isExplain    
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ec0: 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50   True if the EXP
6ed0: 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73  LAIN keywords is
6ee0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20   present */.){. 
6ef0: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
6f00: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
6f10: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
6f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
6f30: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
6f40: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
6f50: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
6f60: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
6f70: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
6f80: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
6f90: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
6fa0: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
6fb0: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
6fc0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
6fd0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
6fe0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
6ff0: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
7000: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
7010: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
7020: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
7030: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
7040: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
7050: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
7060: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
7070: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
7080: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
7090: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
70a0: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
70b0: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56  space for.  ** V
70c0: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73  dbeCursor/BtCurs
70d0: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
70e0: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
70f0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
7100: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
7110: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
7120: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
7130: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
7140: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
7150: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
7160: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
7170: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
7180: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
7190: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
71a0: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
71b0: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
71c0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
71d0: 63 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72  cation space for
71e0: 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f   registers..  */
71f0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d  .  if( p->aMem==
7200: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  0 ){.    int nAr
7210: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
7220: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
7230: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
7240: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
7250: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
7260: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
7270: 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72      assert( nVar
7280: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69  >=0 );.    if( i
7290: 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  sExplain && nMem
72a0: 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65  <10 ){.      nMe
72b0: 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  m = 10;.    }.  
72c0: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 73 71 6c 69    p->aMem = sqli
72d0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
72e0: 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 4d 65 6d  db,.        nMem
72f0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20  *sizeof(Mem)    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
7310: 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56  em */.      + nV
7320: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20  ar*sizeof(Mem)  
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7340: 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  aVar */.      + 
7350: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
7360: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
7370: 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20  * apArg */.     
7380: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63   + nVar*sizeof(c
7390: 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20  har*)           
73a0: 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20    /* azVar */.  
73b0: 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69      + nCursor*si
73c0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
73d0: 29 2b 31 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f  )+1  /* apCsr */
73e0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
73f0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
7400: 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  d ){.      p->aM
7410: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
7420: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
7430: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
7440: 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  .      p->nMem =
7450: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 2f 2a   nMem;        /*
7460: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
7470: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
7480: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d     p->aVar = &p-
7490: 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b 31 5d 3b 0a 20  >aMem[nMem+1];. 
74a0: 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e       p->nVar = n
74b0: 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b  Var;.      p->ok
74c0: 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Var = 0;.      p
74d0: 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a  ->apArg = (Mem**
74e0: 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b  )&p->aVar[nVar];
74f0: 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  .      p->azVar 
7500: 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70  = (char**)&p->ap
7510: 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20  Arg[nArg];.     
7520: 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64 62   p->apCsr = (Vdb
7530: 65 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a  eCursor**)&p->az
7540: 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20  Var[nVar];.     
7550: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
7560: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72  ursor;.      for
7570: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
7580: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
7590: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
75a0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  EM_Null;.       
75b0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
75c0: 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   db;.      }.   
75d0: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
75e0: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
75f0: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
7600: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
7610: 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b          p->aMem[
7620: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
7630: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
7640: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7650: 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70  G.  for(n=1; n<p
7660: 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  ->nMem; n++){.  
7670: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
7680: 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20  m[n].db==db );. 
7690: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e   }.#endif..  p->
76a0: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
76b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
76c0: 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30  p->uniqueCnt = 0
76d0: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
76e0: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
76f0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69   p->explain |= i
7700: 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d  sExplain;.  p->m
7710: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
7720: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
7730: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
7740: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
7750: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
7760: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
7770: 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20  openedStatement 
7780: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
7790: 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
77a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
77b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
77c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  ++){.      p->aO
77d0: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
77e0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
77f0: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  cles = 0;.    }.
7800: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
7810: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
7820: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
7830: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
7840: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
7850: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
7860: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
7870: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
7880: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
7890: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
78a0: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
78b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
78c0: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
78d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
78e0: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
78f0: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43  );.    /* The pC
7900: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
7910: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
7920: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
7930: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20  ists, by.    ** 
7940: 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
7950: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  */.  }else if( p
7960: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
7970: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
7980: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
7990: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  pCursor);.  }.#i
79a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79b0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
79c0: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
79d0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
79e0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
79f0: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
7a00: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
7a10: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
7a20: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
7a30: 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75  ule = pCx->pModu
7a40: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
7a50: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
7a60: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
7a70: 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a  fetyOff(p->db);.
7a80: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
7a90: 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29  ose(pVtabCursor)
7aa0: 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
7ab0: 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64  te3SafetyOn(p->d
7ac0: 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  b);.    p->inVta
7ad0: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
7ae0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
7af0: 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54  Cx->ephemPseudoT
7b00: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
7b10: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
7b20: 20 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pCx->pData);.  
7b30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
7b40: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63   all cursors exc
7b50: 65 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72  ept for VTab cur
7b60: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75  sors that are cu
7b70: 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73  rrently.** in us
7b80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7b90: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
7ba0: 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61  sExceptActiveVta
7bb0: 62 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  bs(Vdbe *p){.  i
7bc0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
7bd0: 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCsr==0 ) return
7be0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7bf0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
7c00: 0a 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20  .    VdbeCursor 
7c10: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
7c20: 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26  ];.    if( pC &&
7c30: 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68   (!p->inVtabMeth
7c40: 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62  od || !pC->pVtab
7c50: 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
7c60: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
7c70: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
7c80: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
7c90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
7ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
7cb0: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
7cc0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
7cd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
7ce0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
7cf0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
7d00: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
7d10: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
7d20: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
7d30: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
7d40: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
7d50: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
7d60: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
7d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7d80: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
7d90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
7da0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
7db0: 62 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a  b;.  Mem *pMem;.
7dc0: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
7dd0: 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61  sExceptActiveVta
7de0: 62 73 28 70 29 3b 0a 20 20 66 6f 72 28 70 4d 65  bs(p);.  for(pMe
7df0: 6d 3d 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 69  m=&p->aMem[1], i
7e00: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
7e10: 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  i++, pMem++){.  
7e20: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7e30: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29  s & MEM_RowSet )
7e40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
7e50: 6f 77 53 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d  owSetClear(pMem-
7e60: 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 20  >u.pRowSet);.   
7e70: 20 7d 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70   }.    MemSetTyp
7e80: 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f  eFlag(pMem, MEM_
7e90: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  Null);.  }.  rel
7ea0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
7eb0: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
7ec0: 6d 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e  m);.  if( p->con
7ed0: 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20  textStack ){.   
7ee0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7ef0: 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  b, p->contextSta
7f00: 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  ck);.  }.  p->co
7f10: 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a  ntextStack = 0;.
7f20: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
7f30: 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  kDepth = 0;.  p-
7f40: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
7f50: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
7f60: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
7f70: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
7f80: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
7f90: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
7fa0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
7fb0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
7fc0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
7fd0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
7fe0: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
7ff0: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
8000: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
8010: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
8020: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
8030: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
8040: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
8050: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
8060: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
8070: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
8080: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
8090: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
80a0: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
80b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
80c0: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
80d0: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
80e0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
80f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
8100: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
8110: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
8120: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
8130: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
8140: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
8150: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8160: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
8170: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
8180: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
8190: 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43  esColumn = nResC
81a0: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
81b0: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
81c0: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
81d0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
81e0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
81f0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
8200: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
8210: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
8220: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
8230: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
8240: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
8250: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
8260: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
8270: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
8280: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
8290: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
82a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
82b0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
82c0: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
82d0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
82e0: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
82f0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
8300: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
8310: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
8320: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
8330: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
8340: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
8350: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
8360: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
8370: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
8380: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
8390: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
83a0: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
83b0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
83c0: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
83d0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
83e0: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
83f0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
8400: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
8410: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
8420: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8430: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
8440: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
8470: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
8480: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
84b0: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
84c0: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
84d0: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
84f0: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
8500: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
8510: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8520: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
8530: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8540: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
8550: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
8560: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
8570: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
8580: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
8590: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
85a0: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
85b0: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
85c0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
85d0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
85e0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
85f0: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
8600: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
8610: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
8620: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
8630: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
8640: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
8650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8660: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
8670: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
8680: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
8690: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
86a0: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
86b0: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
86c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
86d0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
86e0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
86f0: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
8700: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
8710: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
8720: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
8730: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
8740: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8750: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
8760: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
8770: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
8780: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
8790: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
87a0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
87b0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
87c0: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
87d0: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
87e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
87f0: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
8800: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
8810: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
8820: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
8830: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8840: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
8850: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
8860: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
8870: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
8880: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
8890: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
88a0: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
88b0: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
88c0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
88d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
88e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
88f0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
8900: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
8910: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
8920: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
8930: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
8940: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
8950: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
8960: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
8970: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
8980: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
8990: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
89a0: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
89b0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
89c0: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
89d0: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
89e0: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
89f0: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
8a00: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
8a10: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
8a20: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
8a30: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
8a40: 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d  nc(db, &p->zErrM
8a50: 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
8a60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8a70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
8a80: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
8a90: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
8aa0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
8ab0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
8ac0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
8ad0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
8ae0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
8af0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
8b00: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
8b10: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
8b20: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
8b30: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
8b40: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
8b50: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
8b60: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
8b70: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
8b80: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
8b90: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
8ba0: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
8bb0: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
8bc0: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
8bd0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8be0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
8bf0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
8c00: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
8c10: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
8c20: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
8c30: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
8c40: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
8c50: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
8c60: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
8c70: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
8c80: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
8c90: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
8ca0: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
8cb0: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
8cc0: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
8cd0: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
8ce0: 6b 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 73  k ){.    (void)s
8cf0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
8d00: 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62  db);.    rc = db
8d10: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
8d20: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
8d30: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
8d40: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
8d50: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8d60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8d70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
8d80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8d90: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
8da0: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
8db0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
8dc0: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
8dd0: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
8de0: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
8df0: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
8e00: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
8e10: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
8e20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
8e30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
8e40: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
8e50: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
8e60: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
8e70: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
8e80: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
8e90: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
8ea0: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
8eb0: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
8ec0: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
8ed0: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
8ee0: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
8ef0: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
8f00: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
8f10: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
8f20: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
8f30: 69 66 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71  if( 0==strlen(sq
8f40: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
8f50: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
8f60: 2e 70 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73  .pBt)) || nTrans
8f70: 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  <=1 ){.    for(i
8f80: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
8f90: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
8fa0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
8fb0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8fc0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
8fd0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
8fe0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
8ff0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
9000: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
9010: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9020: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
9030: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
9040: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
9050: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
9060: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
9070: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
9080: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
9090: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
90a0: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
90b0: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
90c0: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
90d0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
90e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
90f0: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
9100: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
9110: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
9120: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
9130: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
9140: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
9150: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
9160: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
9170: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9180: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
9190: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
91a0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
91b0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
91c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
91d0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
91e0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
91f0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
9200: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9210: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
9220: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
9230: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
9240: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
9250: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
9260: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
9270: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
9280: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
9290: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
92a0: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
92b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
92c0: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
92d0: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
92e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
92f0: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
9300: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
9310: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
9320: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
9330: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
9340: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
9350: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
9360: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
9370: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
9380: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
9390: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
93a0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
93b0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
93c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
93d0: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
93e0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
93f0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a  ;.    int res;..
9400: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
9410: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9420: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
9430: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72  do {.      u32 r
9440: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c  andom;.      sql
9450: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9460: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
9470: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
9480: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29  s(sizeof(random)
9490: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20  , &random);.    
94a0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
94b0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
94c0: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
94d0: 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78  nFile, random&0x
94e0: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
94f0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
9500: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9510: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9520: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
9530: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
9540: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
9550: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
9560: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
9570: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
9580: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
9590: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
95a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
95b0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
95c0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
95d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
95e0: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
95f0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
9600: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
9610: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
9620: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
9630: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
9640: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
9650: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
9660: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
9670: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
9680: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9690: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
96a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
96b0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
96c0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
96d0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
96e0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
96f0: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
9700: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
9710: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
9720: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
9730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9740: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
9750: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
9760: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
9770: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
9780: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9790: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
97a0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
97b0: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
97c0: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
97d0: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
97e0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
97f0: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
9800: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
9810: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
9820: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
9830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
9840: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
9850: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
9860: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
9870: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
9880: 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e  f( i==1 ) contin
9890: 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  ue;   /* Ignore 
98a0: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
98b0: 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  e */.      if( s
98c0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
98d0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
98e0: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
98f0: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
9900: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
9910: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
9920: 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
9930: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
9940: 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79  * Ignore :memory
9950: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
9960: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
9970: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
9980: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
9990: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
99a0: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
99b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
99c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
99d0: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
99e0: 20 7a 46 69 6c 65 2c 20 28 69 6e 74 29 73 74 72   zFile, (int)str
99f0: 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  len(zFile)+1, of
9a00: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
9a10: 66 66 73 65 74 20 2b 3d 20 73 74 72 6c 65 6e 28  ffset += strlen(
9a20: 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
9a30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9a40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
9a50: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
9a60: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
9a70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
9a80: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
9a90: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
9aa0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9ab0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
9ac0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
9ad0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
9ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9af0: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
9b00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9b10: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
9b20: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
9b30: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
9b40: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
9b50: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
9b60: 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65  */.    zMainFile
9b70: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
9b80: 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44  etDirname(db->aD
9b90: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[0].pBt);.    i
9ba0: 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20  f( (needSync .  
9bb0: 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74     && (0==(sqlit
9bc0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
9bd0: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
9be0: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
9bf0: 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20  SEQUENTIAL)).   
9c00: 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33    && (rc=sqlite3
9c10: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
9c20: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
9c30: 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  AL))!=SQLITE_OK)
9c40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9c50: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
9c60: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
9c70: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
9c80: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
9c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9ca0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
9cb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9cc0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
9cd0: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
9ce0: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
9cf0: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
9d00: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
9d10: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
9d20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9d30: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
9d40: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
9d50: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
9d60: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
9d70: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
9d80: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
9d90: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
9da0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
9db0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
9dc0: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
9dd0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9de0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9df0: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
9e00: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
9e10: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
9e20: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
9e30: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
9e40: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
9e50: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
9e60: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
9e70: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9e80: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
9e90: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
9ea0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
9eb0: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
9ec0: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  e failure occure
9ed0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9ee0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
9ef0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
9f00: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
9f10: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
9f20: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
9f30: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
9f40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9f50: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9f60: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
9f70: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
9f80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
9f90: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
9fa0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
9fb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9fc0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9fd0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
9fe0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9ff0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
a000: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
a010: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
a020: 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
a030: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
a040: 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
a050: 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
a060: 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
a070: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
a080: 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
a090: 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
a0a0: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
a0b0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
a0c0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
a0d0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
a0e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a0f0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
a100: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
a110: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
a120: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
a130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
a140: 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
a150: 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
a160: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
a170: 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
a180: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
a190: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
a1a0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
a1b0: 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
a1c0: 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
a1d0: 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
a1e0: 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
a1f0: 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
a200: 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
a210: 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
a220: 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
a230: 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
a240: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
a250: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
a260: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
a270: 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
a280: 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
a290: 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
a2a0: 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
a2b0: 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
a2c0: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
a2d0: 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
a2e0: 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
a2f0: 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
a300: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
a310: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
a320: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
a330: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a340: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
a350: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
a360: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
a370: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
a380: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a390: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
a3a0: 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20  aseTwo(pBt);.   
a3b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
a3c0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
a3d0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
a3e0: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
a3f0: 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
a400: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
a410: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
a420: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
a430: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
a440: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
a450: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  at the sqlite3.a
a460: 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75  ctiveVdbeCnt cou
a470: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
a480: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
a490: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
a4a0: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
a4b0: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
a4c0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
a4d0: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
a4e0: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
a4f0: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
a500: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
a510: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
a520: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
a530: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
a540: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
a550: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
a560: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
a570: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
a580: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
a590: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
a5a0: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
a5b0: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
a5c0: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
a5d0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
a5e0: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
a5f0: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
a600: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
a610: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
a620: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
a630: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
a640: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
a650: 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
a660: 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
a670: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
a680: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
a690: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
a6a0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
a6b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
a6c0: 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64  ite==db->writeVd
a6d0: 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65  beCnt );.}.#else
a6e0: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
a6f0: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
a700: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
a710: 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61   every Btree tha
a720: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  t in database co
a730: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63  nnection db whic
a740: 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  h .** has been m
a750: 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20  odified, "trip" 
a760: 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61  or invalidate ea
a770: 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20  ch cursor in.** 
a780: 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74  that Btree might
a790: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
a7a0: 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ied so that the 
a7b0: 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65  cursor.** can ne
a7c0: 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69  ver be used agai
a7d0: 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  n.  This happens
a7e0: 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
a7f0: 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65  .*** occurs.  We
a800: 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c   have to trip al
a810: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73  l the other curs
a820: 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72  ors, even.** cur
a830: 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56  sor from other V
a840: 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  Ms in different 
a850: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
a860: 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74  ions,.** so that
a870: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72   none of them tr
a880: 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74  y to use the dat
a890: 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a  a at which they.
a8a0: 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67  ** were pointing
a8b0: 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d   and which now m
a8c0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61  ay have been cha
a8d0: 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74  nged due.** to t
a8e0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
a8f0: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74  ** Remember that
a900: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20   a rollback can 
a910: 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f  delete tables co
a920: 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65  mplete and.** re
a930: 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e  order rootpages.
a940: 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73    So it is not s
a950: 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74  ufficient just t
a960: 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74  o save.** the st
a970: 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
a980: 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  r.  We have to i
a990: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75  nvalidate the cu
a9a0: 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20  rsor.** so that 
a9b0: 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  it is never used
a9c0: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   again..*/.stati
a9d0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
a9e0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
a9f0: 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33  edBtrees(sqlite3
aa00: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
aa10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
aa20: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
aa30: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
aa40: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
aa50: 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42  f( p && sqlite3B
aa60: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
aa70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
aa80: 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
aa90: 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41  sors(p, SQLITE_A
aaa0: 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  BORT);.    }.  }
aab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
aac0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
aad0: 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
aae0: 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
aaf0: 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
ab00: 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
ab10: 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
ab20: 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
ab30: 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
ab40: 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
ab50: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
ab60: 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
ab70: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
ab80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ab90: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
aba0: 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
abb0: 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
abc0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
abd0: 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
abe0: 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72  HALT.  It is har
abf0: 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c  mless to.** call
ac00: 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68   this on a VM th
ac10: 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c  at is in the SQL
ac20: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73  ITE_MAGIC_HALT s
ac30: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tate..**.** Retu
ac40: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
ac50: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
ac60: 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
ac70: 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
ac80: 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
ac90: 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
aca0: 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
acb0: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
acc0: 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
acd0: 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
ace0: 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
acf0: 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
ad00: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
ad10: 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
ad20: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
ad30: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
ad40: 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e   i;.  int (*xFun
ad50: 63 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d  c)(Btree *pBt) =
ad60: 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e   0;  /* Function
ad70: 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68   to call on each
ad80: 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a   btree backend *
ad90: 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63 69 61  /.  int isSpecia
ada0: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
adb0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
adc0: 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  e if SQLITE_NOME
add0: 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20  M or IOERR */.. 
ade0: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
adf0: 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
ae00: 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
ae10: 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
ae20: 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
ae30: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
ae40: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
ae50: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
ae60: 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
ae70: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
ae80: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
ae90: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
aea0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
aeb0: 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
aec0: 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
aed0: 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
aee0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
aef0: 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
af00: 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
af10: 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
af20: 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
af30: 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
af40: 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
af50: 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
af60: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
af70: 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
af80: 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
af90: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
afa0: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
afb0: 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
afc0: 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
afd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
afe0: 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
aff0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
b000: 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
b010: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
b020: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
b030: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
b040: 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
b050: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
b060: 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69 66 28  eVtabs(p);.  if(
b070: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
b080: 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20  MAGIC_RUN ){.   
b090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b0a0: 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63  K;.  }.  checkAc
b0b0: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
b0c0: 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
b0d0: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
b0e0: 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
b0f0: 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
b100: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
b110: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  =0 ){.    int mr
b120: 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
b130: 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
b140: 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a  p->rc */..    /*
b150: 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
b160: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
b170: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
b180: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
b190: 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d  rrayEnter(&p->aM
b1a0: 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  utex);..    /* C
b1b0: 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
b1c0: 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
b1d0: 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
b1e0: 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
b1f0: 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
b200: 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
b210: 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
b220: 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
b240: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
b250: 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
b260: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
b270: 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
b280: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
b290: 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
b2a0: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e   read-only, we n
b2b0: 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61  eed do no rollba
b2c0: 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72  ck at all. Other
b2d0: 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70  wise,.      ** p
b2e0: 72 6f 63 65 65 64 20 77 69 74 68 20 74 68 65 20  roceed with the 
b2f0: 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
b300: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b310: 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
b320: 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
b330: 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
b340: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
b350: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
b360: 4f 43 4b 45 44 20 26 26 20 70 2d 3e 75 73 65 73  OCKED && p->uses
b370: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
b380: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
b390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
b3a0: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
b3b0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
b3c0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
b3d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6d 72 63    }else if( (mrc
b3e0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
b3f0: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
b400: 4c 4c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL).            
b410: 20 20 20 20 20 20 20 26 26 20 70 2d 3e 75 73 65         && p->use
b420: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
b430: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
b440: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
b450: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
b460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b470: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
b480: 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
b490: 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
b4a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
b4b0: 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
b4c0: 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
b4d0: 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
b4e0: 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
b4f0: 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
b500: 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
b510: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76  */.          inv
b520: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
b530: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
b540: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
b550: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
b560: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
b570: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
b580: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
b590: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
b5a0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
b5b0: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
b5c0: 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
b5d0: 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
b5e0: 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20   vdbe, then.    
b5f0: 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  ** we do either 
b600: 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
b610: 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
b620: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
b630: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
b640: 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
b650: 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
b660: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
b670: 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
b680: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
b690: 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
b6a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
b6b0: 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
b6c0: 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
b6d0: 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
b6e0: 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62   && db->writeVdb
b6f0: 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  eCnt==(p->readOn
b700: 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
b710: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
b720: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
b730: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
b740: 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
b750: 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
b760: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
b770: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
b780: 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64  true, and the vd
b790: 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a  be program was .
b7a0: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65          ** succe
b7b0: 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20  ssful or hit an 
b7c0: 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
b7d0: 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  aint. This means
b7e0: 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
b7f0: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
b800: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
b810: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76        int rc = v
b820: 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29  dbeCommit(db, p)
b830: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
b840: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
b850: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b860: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
b870: 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65  yLeave(&p->aMute
b880: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  x);.          re
b890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
b8a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
b8b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b8c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
b8d0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
b8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
b8f0: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
b900: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
b920: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
b930: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
b940: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
b950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
b960: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
b970: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
b980: 20 69 66 28 20 21 78 46 75 6e 63 20 29 7b 0a 20   if( !xFunc ){. 
b990: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
b9a0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
b9b0: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
b9c0: 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
b9d0: 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61  if( p->openedSta
b9e0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
b9f0: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
ba00: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
ba10: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  mt;.        } . 
ba20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
ba30: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
ba40: 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
ba50: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
ba60: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
ba70: 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tmt;.      }else
ba80: 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
ba90: 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
baa0: 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b  ifiedBtrees(db);
bab0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bac0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
bad0: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
bae0: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
baf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
bb00: 20 20 2f 2a 20 49 66 20 78 46 75 6e 63 20 69 73    /* If xFunc is
bb10: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
bb20: 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c  it is one of sql
bb30: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
bb40: 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20 2a 2a 20  kStmt or.    ** 
bb50: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
bb60: 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20  itStmt. Call it 
bb70: 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 62 61 63  once on each bac
bb80: 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  kend. If an erro
bb90: 72 20 6f 63 63 75 72 73 0a 20 20 20 20 2a 2a 20  r occurs.    ** 
bba0: 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
bbb0: 6f 64 65 20 69 73 20 73 74 69 6c 6c 20 53 51 4c  ode is still SQL
bbc0: 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20  ITE_OK, set the 
bbd0: 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 74  return code to t
bbe0: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 65 72  he new.    ** er
bbf0: 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a  ror value..    *
bc00: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 78 46  /.    assert(!xF
bc10: 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20 78 46 75  unc ||.      xFu
bc20: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  nc==sqlite3Btree
bc30: 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c 0a 20 20  CommitStmt ||.  
bc40: 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74      xFunc==sqlit
bc50: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
bc60: 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 66  tmt.    );.    f
bc70: 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20 26 26  or(i=0; xFunc &&
bc80: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
bc90: 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  { .      int rc;
bca0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
bcb0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
bcc0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
bcd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
bce0: 3d 20 78 46 75 6e 63 28 70 42 74 29 3b 0a 20 20  = xFunc(pBt);.  
bcf0: 20 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20        if( rc && 
bd00: 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  (p->rc==SQLITE_O
bd10: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
bd20: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 20 29  TE_CONSTRAINT) )
bd30: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
bd40: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
bd50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
bd60: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
bd70: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  .          p->zE
bd80: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
bd90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bda0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
bdb0: 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
bdc0: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
bdd0: 4c 45 54 45 20 61 6e 64 20 74 68 65 20 73 74 61  LETE and the sta
bde0: 74 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69  tement was commi
bdf0: 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65  tted, .    ** se
be00: 74 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  t the change cou
be10: 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
be20: 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
be30: 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  ntOn && p->pc>=0
be40: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78   ){.      if( !x
be50: 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73  Func || xFunc==s
be60: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
be70: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  tStmt ){.       
be80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
be90: 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
bea0: 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
beb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
bec0: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
bed0: 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
bee0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
bef0: 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nge = 0;.    }. 
bf00: 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   .    /* Rollbac
bf10: 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20  k or commit any 
bf20: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74  schema changes t
bf30: 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f  hat occurred. */
bf40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  .    if( p->rc!=
bf50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d  SQLITE_OK && db-
bf60: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
bf70: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
bf80: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
bf90: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
bfa0: 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62  db, 0);.      db
bfb0: 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66  ->flags = (db->f
bfc0: 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e  lags | SQLITE_In
bfd0: 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20  ternChanges);.  
bfe0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
bff0: 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
c000: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
c010: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
c020: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
c030: 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
c040: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
c050: 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
c060: 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
c070: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
c080: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
c090: 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62     db->activeVdb
c0a0: 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  eCnt--;.    if( 
c0b0: 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  !p->readOnly ){.
c0c0: 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56        db->writeV
c0d0: 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a  dbeCnt--;.    }.
c0e0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
c0f0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64  activeVdbeCnt>=d
c100: 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20  b->writeVdbeCnt 
c110: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
c120: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
c130: 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
c140: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
c150: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
c160: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c170: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
c180: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
c190: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c1a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
c1b0: 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
c1c0: 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
c1d0: 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
c1e0: 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
c1f0: 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
c200: 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
c210: 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
c220: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
c230: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
c240: 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
c250: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
c260: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c270: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
c280: 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
c290: 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
c2a0: 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
c2b0: 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
c2c0: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
c2d0: 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
c2e0: 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
c2f0: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
c300: 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
c310: 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
c320: 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
c330: 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
c340: 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
c350: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
c360: 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
c370: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
c380: 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
c390: 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
c3a0: 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
c3b0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
c3c0: 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
c3d0: 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
c3e0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
c3f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
c400: 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
c410: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
c420: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
c430: 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
c440: 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
c450: 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
c460: 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
c470: 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
c480: 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
c490: 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
c4a0: 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
c4b0: 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
c4c0: 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  */.  (void)sqlit
c4d0: 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a  e3SafetyOn(db);.
c4e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
c4f0: 74 28 70 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  t(p);.  (void)sq
c500: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
c510: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  b);..  /* If the
c520: 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
c530: 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
c540: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
c550: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
c560: 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
c570: 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
c580: 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
c590: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
c5a0: 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
c5b0: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
c5c0: 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
c5d0: 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
c5e0: 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
c5f0: 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
c600: 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
c610: 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
c620: 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
c630: 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
c640: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
c650: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  pc>=0 ){.    if(
c660: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
c670: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
c680: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
c690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
c6a0: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
c6b0: 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67  rr,-1,p->zErrMsg
c6c0: 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c  ,SQLITE_UTF8,SQL
c6d0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
c6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
c6f0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
c700: 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
c710: 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
c720: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c730: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
c740: 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
c750: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
c760: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
c770: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
c780: 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
c790: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c7a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
c7b0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
c7c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c7d0: 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
c7e0: 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
c7f0: 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
c800: 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
c810: 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
c820: 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
c830: 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
c840: 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
c850: 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
c860: 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
c870: 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
c880: 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
c890: 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
c8a0: 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
c8b0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
c8c0: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
c8d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
c8e0: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
c8f0: 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
c900: 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
c910: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
c920: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  T);.    sqlite3D
c930: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
c940: 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
c950: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
c960: 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
c970: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
c980: 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
c990: 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
c9a0: 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
c9b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
c9c0: 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
c9d0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
c9e0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
c9f0: 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
ca00: 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
ca10: 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
ca20: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
ca30: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ca40: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
ca50: 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
ca60: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
ca70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
ca80: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
ca90: 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
caa0: 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
cab0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
cac0: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
cad0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
cae0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
caf0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
cb00: 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
cb10: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
cb20: 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
cb30: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
cb40: 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
cb50: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
cb60: 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
cb70: 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
cb80: 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
cb90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cba0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
cbb0: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
cbc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cbd0: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
cbe0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
cbf0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
cc00: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
cc10: 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
cc20: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
cc30: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
cc40: 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
cc50: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
cc60: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
cc70: 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
cc80: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
cc90: 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
cca0: 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
ccb0: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
ccc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
ccd0: 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
cce0: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
ccf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
cd00: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
cd10: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
cd20: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
cd30: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
cd40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
cd50: 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
cd60: 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
cd70: 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
cd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d    }else if( p->m
cd90: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
cda0: 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74  _INIT ){.    ret
cdb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
cdc0: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
cdd0: 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
cde0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cdf0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
ce00: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
ce10: 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
ce20: 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
ce30: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
ce40: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
ce50: 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
ce60: 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
ce70: 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
ce80: 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
ce90: 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
cea0: 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
ceb0: 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
cec0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
ced0: 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
cee0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
cef0: 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
cf00: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
cf10: 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
cf20: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
cf30: 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
cf40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
cf50: 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
cf60: 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
cf70: 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
cf80: 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
cf90: 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75  &(1<<i))) && pAu
cfa0: 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20  x->pAux ){.     
cfb0: 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
cfc0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
cfd0: 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
cfe0: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
cff0: 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75  .      pAux->pAu
d000: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
d010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
d020: 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
d030: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d040: 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
d050: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
d060: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
d070: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
d080: 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
d090: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
d0a0: 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
d0b0: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
d0c0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
d0d0: 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
d0e0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
d0f0: 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
d100: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
d110: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
d120: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
d130: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
d140: 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  ( p->aOp ){.    
d150: 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *pOp = p->aOp
d160: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d170: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f  <p->nOp; i++, pO
d180: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65  p++){.      free
d190: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
d1a0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
d1b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d1c0: 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65  BUG.      sqlite
d1d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
d1e0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64  >zComment);.#end
d1f0: 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  if     .    }.  
d200: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d210: 64 62 2c 20 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d  db, p->aOp);.  }
d220: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
d230: 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
d240: 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Var);.  sqlite3D
d250: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
d260: 62 65 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  bel);.  if( p->a
d270: 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Mem ){.    sqlit
d280: 65 33 44 62 46 72 65 65 28 64 62 2c 20 26 70 2d  e3DbFree(db, &p-
d290: 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20 20 7d 0a 20  >aMem[1]);.  }. 
d2a0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
d2b0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
d2c0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
d2d0: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
d2e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
d2f0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
d300: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
d310: 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67  >zSql);.  p->mag
d320: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
d330: 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 44  DEAD;.  sqlite3D
d340: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
d350: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  ./*.** If a Move
d360: 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
d370: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
d380: 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
d390: 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
d3a0: 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e  eTo now.  Return
d3b0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
d3c0: 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73   If no MoveTo is
d3d0: 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a   pending, this.*
d3e0: 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  * routine does n
d3f0: 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72  othing and retur
d400: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
d410: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
d420: 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
d430: 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
d440: 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
d450: 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
d460: 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
d470: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
d480: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
d490: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
d4a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
d4b0: 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
d4c0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
d4d0: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
d4e0: 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  acked(p->pCursor
d4f0: 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
d500: 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
d510: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
d520: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c  urn rc;.    p->l
d530: 61 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f  astRowid = keyTo
d540: 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  Int(p->movetoTar
d550: 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  get);.    p->row
d560: 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d  idIsValid = res=
d570: 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66 28  =0 ?1:0;.    if(
d580: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
d590: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d5a0: 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72  eNext(p->pCursor
d5b0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69  , &res);.      i
d5c0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d5d0: 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  c;.    }.#ifdef 
d5e0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
d5f0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
d600: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
d610: 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
d620: 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
d630: 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
d640: 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65  ACHE_STALE;.  }e
d650: 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73  lse if( p->pCurs
d660: 6f 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  or ){.    int ha
d670: 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
d680: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d690: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
d6a0: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
d6b0: 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
d6c0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d6d0: 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
d6e0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
d6f0: 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
d700: 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
d710: 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
d720: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d730: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d740: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
d750: 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
d760: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
d770: 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
d780: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d790: 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
d7a0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
d7b0: 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
d7c0: 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
d7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d7e0: 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
d7f0: 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
d800: 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
d810: 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
d820: 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
d830: 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
d840: 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
d850: 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
d860: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
d870: 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
d880: 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
d890: 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
d8a0: 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
d8b0: 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
d8c0: 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
d8d0: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
d8e0: 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
d8f0: 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
d900: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
d910: 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
d920: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
d930: 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
d940: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
d950: 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
d960: 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
d970: 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
d980: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
d990: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
d9a0: 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
d9b0: 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
d9c0: 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
d9d0: 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
d9e0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
d9f0: 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
da00: 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
da10: 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
da20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
da30: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
da40: 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
da50: 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
da60: 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
da70: 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
da80: 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
da90: 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
daa0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
dab0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
dac0: 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
dad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
dae0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
daf0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
db00: 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
db10: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
db20: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
db30: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
db40: 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
db70: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
db80: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
db90: 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
dba0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
dbb0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
dbc0: 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
dbd0: 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
dbe0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
dbf0: 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
dc20: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
dc30: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
dc40: 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
dc50: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
dc60: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
dc90: 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
dca0: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
dcb0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
dcc0: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
dcd0: 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
dce0: 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
dcf0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
dd00: 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
dd10: 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
dd20: 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
dd50: 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
dd60: 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
dd70: 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
dd80: 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
dd90: 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
dda0: 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
ddb0: 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
ddc0: 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
ddd0: 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
dde0: 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
ddf0: 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
de00: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
de10: 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
de20: 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
de30: 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
de40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
de50: 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
de60: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
de70: 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
de80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
de90: 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
dea0: 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
deb0: 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
dec0: 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
ded0: 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
dee0: 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
def0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
df00: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
df10: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
df20: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
df30: 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
df40: 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
df50: 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
df60: 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
df70: 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
df80: 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
df90: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
dfa0: 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
dfb0: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26  file_format>=4 &
dfc0: 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20  & (i&1)==i ){.  
dfd0: 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33      return 8+(u3
dfe0: 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  2)i;.    }.    u
dff0: 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
e000: 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
e010: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
e020: 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
e030: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
e040: 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
e050: 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
e060: 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
e070: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
e080: 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
e090: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
e0a0: 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
e0b0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
e0c0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
e0d0: 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
e0e0: 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
e0f0: 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
e100: 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
e110: 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65  ob) );.  n = pMe
e120: 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
e130: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
e140: 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
e150: 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73  .nZero;.  }.  as
e160: 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
e170: 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
e180: 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
e190: 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
e1a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e1b0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
e1c0: 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
e1d0: 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
e1e0: 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
e1f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
e200: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
e210: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
e220: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
e230: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
e240: 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
e250: 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
e260: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
e270: 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
e280: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
e290: 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
e2a0: 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
e2b0: 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
e2c0: 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
e2d0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
e2e0: 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
e2f0: 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
e300: 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
e310: 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
e320: 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
e330: 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
e340: 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
e350: 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
e360: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
e370: 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
e380: 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
e390: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
e3a0: 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
e3b0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
e3c0: 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
e3d0: 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
e3e0: 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
e3f0: 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
e400: 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
e410: 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
e420: 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
e430: 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
e440: 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
e450: 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
e460: 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
e470: 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
e480: 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
e490: 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
e4a0: 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
e4b0: 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
e4c0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
e4d0: 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
e4e0: 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
e4f0: 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
e500: 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
e510: 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
e520: 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
e530: 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
e540: 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
e550: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
e560: 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
e570: 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
e580: 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
e590: 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
e5a0: 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
e5b0: 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
e5c0: 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
e5d0: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
e5e0: 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
e5f0: 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
e600: 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
e610: 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
e620: 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
e630: 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
e640: 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
e650: 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
e660: 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
e670: 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
e680: 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
e690: 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
e6a0: 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
e6b0: 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
e6c0: 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
e6d0: 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
e6e0: 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
e6f0: 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
e700: 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
e710: 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
e720: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
e730: 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
e740: 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
e750: 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
e760: 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
e770: 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
e780: 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
e790: 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
e7a0: 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
e7b0: 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
e7c0: 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
e7d0: 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
e7e0: 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
e7f0: 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
e800: 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
e810: 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
e820: 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
e830: 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
e840: 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
e850: 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
e860: 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
e870: 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
e880: 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
e890: 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
e8a0: 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
e8b0: 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
e8c0: 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
e8d0: 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
e8e0: 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
e8f0: 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
e900: 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
e910: 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
e920: 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
e930: 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
e940: 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
e950: 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
e960: 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
e970: 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
e980: 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
e990: 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
e9a0: 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
e9b0: 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
e9c0: 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
e9d0: 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
e9e0: 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
e9f0: 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
ea00: 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
ea10: 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
ea20: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
ea30: 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
ea40: 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
ea50: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
ea60: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
ea70: 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
ea80: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
ea90: 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
eaa0: 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
eab0: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
eac0: 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
ead0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
eae0: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
eaf0: 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
eb00: 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
eb10: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
eb20: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
eb30: 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
eb40: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
eb50: 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
eb60: 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61  [].  nBuf must a
eb70: 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67  lways be.** larg
eb80: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
eb90: 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
eba0: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  d.  Except, if t
ebb0: 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61  he field is.** a
ebc0: 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72   blob with a zer
ebd0: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74  o-filled tail, t
ebe0: 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20  hen buf[] might 
ebf0: 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68  be just the righ
ec00: 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c  t.** size to hol
ec10: 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63  d everything exc
ec20: 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  ept for the zero
ec30: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49  -filled tail.  I
ec40: 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e  f buf[].** is on
ec50: 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ly big enough to
ec60: 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65   hold the non-ze
ec70: 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20  ro prefix, then 
ec80: 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a  only write that.
ec90: 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62  ** prefix into b
eca0: 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75  uf[].  But if bu
ecb0: 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  f[] is large eno
ecc0: 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ugh to hold both
ecd0: 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61   the.** prefix a
ece0: 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e  nd the tail then
ecf0: 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69   write the prefi
ed00: 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61  x and set the ta
ed10: 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72  il to all.** zer
ed20: 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  os..**.** Return
ed30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ed40: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
ed50: 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
ed60: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
ed70: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
ed80: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
ed90: 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
eda0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
edb0: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
edc0: 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
edd0: 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
ede0: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
edf0: 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
ee00: 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d  buf, int nBuf, M
ee10: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
ee20: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
ee30: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
ee40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ee50: 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
ee60: 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20  _format);.  int 
ee70: 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
ee80: 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
ee90: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
eea0: 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
eeb0: 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
eec0: 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  v;.    int i;.  
eed0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
eee0: 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
eef0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
ef00: 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
ef10: 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
ef20: 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73  (&v, &pMem->r, s
ef30: 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
ef40: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
ef50: 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
ef60: 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
ef70: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
ef80: 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
ef90: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
efa0: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
efb0: 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
efc0: 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20   len<=nBuf );.  
efd0: 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
efe0: 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
eff0: 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
f000: 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
f010: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
f020: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
f030: 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
f040: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
f050: 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
f060: 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
f070: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
f080: 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
f090: 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
f0a0: 20 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56       == sqlite3V
f0b0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
f0c0: 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
f0d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
f0e0: 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20  m->n<=nBuf );.  
f0f0: 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
f100: 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
f110: 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
f120: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
f130: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
f140: 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70  {.      len += p
f150: 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
f160: 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42 75 66      if( len>nBuf
f170: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20   ){.        len 
f180: 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a  = nBuf;.      }.
f190: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75        memset(&bu
f1a0: 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c  f[pMem->n], 0, l
f1b0: 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20  en-pMem->n);.   
f1c0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
f1d0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
f1e0: 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
f1f0: 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
f200: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 0;.}../*.** De
f210: 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
f220: 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
f230: 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
f240: 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
f250: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
f260: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
f270: 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
f280: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
f290: 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20  s read..*/ .int 
f2a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f2b0: 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
f2c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
f2d0: 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
f2e0: 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
f2f0: 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
f300: 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
f310: 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
f320: 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
f330: 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
f340: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
f350: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
f360: 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
f370: 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
f380: 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
f390: 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
f3a0: 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
f3b0: 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
f3c0: 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
f3d0: 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
f3e0: 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
f3f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
f400: 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
f410: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f420: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
f430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f440: 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
f450: 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
f460: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
f470: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e  Mem->u.i = (sign
f480: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a  ed char)buf[0];.
f490: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f4a0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
f4b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
f4c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
f4d0: 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
f4e0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
f4f0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
f500: 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
f510: 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
f520: 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  1];.      pMem->
f530: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
f540: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
f550: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f560: 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
f570: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
f580: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
f590: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
f5a0: 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c  r)buf[0])<<16) |
f5b0: 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62   (buf[1]<<8) | b
f5c0: 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[2];.      pMe
f5d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f5e0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f5f0: 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
f600: 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
f610: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f620: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
f630: 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32  u.i = (buf[0]<<2
f640: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
f650: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
f660: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
f670: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f680: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
f690: 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 4;.    }.   
f6a0: 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
f6b0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
f6c0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  ger */.      u64
f6d0: 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63   x = (((signed c
f6e0: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
f6f0: 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
f700: 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c  u32 y = (buf[2]<
f710: 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c  <24) | (buf[3]<<
f720: 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38  16) | (buf[4]<<8
f730: 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20  ) | buf[5];.    
f740: 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
f750: 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  y;.      pMem->u
f760: 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
f770: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f780: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
f790: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
f7a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
f7b0: 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
f7c0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
f7d0: 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
f7e0: 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
f7f0: 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  t */.      u64 x
f800: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23  ;.      u32 y;.#
f810: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
f820: 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
f830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
f840: 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
f850: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
f860: 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
f870: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
f880: 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
f890: 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  .      ** byte o
f8a0: 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
f8b0: 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
f8c0: 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
f8d0: 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  AT is.      ** d
f8e0: 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
f8f0: 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
f900: 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
f910: 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20  are mixed.      
f920: 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20  ** endian..     
f930: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
f940: 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
f950: 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
f960: 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61  )<<32;.      sta
f970: 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
f980: 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20   r1 = 1.0;.     
f990: 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
f9a0: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
f9b0: 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
f9c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f9d0: 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
f9e0: 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
f9f0: 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
fa00: 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
fa10: 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b  .      x = (buf[
fa20: 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
fa30: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
fa40: 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
fa50: 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d       y = (buf[4]
fa60: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c  <<24) | (buf[5]<
fa70: 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c  <16) | (buf[6]<<
fa80: 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20  8) | buf[7];.   
fa90: 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
faa0: 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   y;.      if( se
fab0: 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
fac0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e          pMem->u.
fad0: 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
fae0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
faf0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
fb00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fb10: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
fb20: 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
fb30: 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b  f(pMem->r)==8 );
fb40: 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78  .        swapMix
fb50: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
fb60: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
fb70: 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73  (&pMem->r, &x, s
fb80: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20  izeof(x));.     
fb90: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
fba0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
fbb0: 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  em->r) ? MEM_Nul
fbc0: 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
fbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
fbe0: 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 8;.    }.    
fbf0: 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
fc00: 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
fc10: 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
fc20: 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
fc30: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
fc40: 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
fc50: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
fc60: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
fc70: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
fc80: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
fc90: 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65     int len = (se
fca0: 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
fcb0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
fcc0: 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
fcd0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65      pMem->n = le
fce0: 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78  n;.      pMem->x
fcf0: 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Del = 0;.      i
fd00: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30  f( serial_type&0
fd10: 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  x01 ){.        p
fd20: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
fd30: 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  _Str | MEM_Ephem
fd40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fd50: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
fd60: 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20  gs = MEM_Blob | 
fd70: 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
fd80: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
fd90: 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  len;.    }.  }. 
fda0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
fdb0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
fdc0: 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
fdd0: 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
fde0: 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20 74   pKey[], parse t
fdf0: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74  he.** record int
fe00: 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  o a UnpackedReco
fe10: 72 64 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  rd structure.  R
fe20: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
fe30: 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75 63  to.** that struc
fe40: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
fe50: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
fe60: 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 73   might provide s
fe70: 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f 66 20  zSpace bytes of 
fe80: 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
fe90: 61 74 20 70 53 70 61 63 65 2e 20 20 54 68 69 73  at pSpace.  This
fea0: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 75 73   space can be us
feb0: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ed to hold the r
fec0: 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65 50  eturned.** VDbeP
fed0: 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72 75  arsedRecord stru
fee0: 63 74 75 72 65 20 69 66 20 69 74 20 69 73 20 6c  cture if it is l
fef0: 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49 66  arge enough.  If
ff00: 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 69   it is.** not bi
ff10: 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65 20  g enough, space 
ff20: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
ff30: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
ff40: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  )..**.** The ret
ff50: 75 72 6e 65 64 20 73 74 72 75 63 74 75 72 65 20  urned structure 
ff60: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
ff70: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a   by a call to.**
ff80: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
ff90: 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
ffa0: 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 64  ()..*/ .Unpacked
ffb0: 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
ffc0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
ffd0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
ffe0: 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
fff0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
10000 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
10010 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10030 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
10040 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
10050 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
10060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
10070 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
10080 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
10090 70 53 70 61 63 65 2c 2f 2a 20 53 70 61 63 65 20  pSpace,/* Space 
100a0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c  available to hol
100b0 64 20 72 65 73 75 6c 74 69 6e 67 20 6f 62 6a 65  d resulting obje
100c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70  ct */.  int szSp
100d0 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ace            /
100e0 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65  * Size of pSpace
100f0 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  [] in bytes */.)
10100 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
10110 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
10120 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
10130 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55  char *)pKey;.  U
10140 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
10150 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 64  ;.  int nByte, d
10160 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
10170 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
10180 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
10190 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
101a0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
101b0 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 0a 20   Mem *pMem;.  . 
101c0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
101d0 4d 65 6d 29 3e 73 69 7a 65 6f 66 28 2a 70 29 20  Mem)>sizeof(*p) 
101e0 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  );.  nByte = siz
101f0 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
10200 66 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29 3b 0a 20  fo->nField+2);. 
10210 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
10220 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  ce ){.    p = sq
10230 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
10240 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
10250 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
10260 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10270 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
10280 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45  NPACKED_NEED_FRE
10290 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  E | UNPACKED_NEE
102a0 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c  D_DESTROY;.  }el
102b0 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 70 61  se{.    p = pSpa
102c0 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  ce;.    p->flags
102d0 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   = UNPACKED_NEED
102e0 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20 20  _DESTROY;.  }.  
102f0 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
10300 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
10310 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
10320 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d  nField + 1;.  p-
10330 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 26  >aMem = pMem = &
10340 28 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b 0a 20 20  ((Mem*)p)[1];.  
10350 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
10360 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
10370 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75    d = szHdr;.  u
10380 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
10390 64 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d  dx<szHdr && u<p-
103a0 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
103b0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
103c0 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
103d0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
103e0 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
103f0 3b 0a 20 20 20 20 69 66 28 20 64 3e 3d 6e 4b 65  ;.    if( d>=nKe
10400 79 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  y && sqlite3Vdbe
10410 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
10420 72 69 61 6c 5f 74 79 70 65 29 3e 30 20 29 20 62  rial_type)>0 ) b
10430 72 65 61 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  reak;.    pMem->
10440 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
10450 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
10460 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
10470 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
10480 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  s = 0;.    pMem-
10490 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
104a0 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
104b0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
104c0 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
104d0 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
104e0 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20  em++;.    u++;. 
104f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
10500 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
10510 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
10520 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74 75 72  eld = u;.  retur
10530 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a 0a 2f  n (void*)p;.}../
10540 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10550 65 20 64 65 73 74 72 6f 79 73 20 61 20 55 6e 70  e destroys a Unp
10560 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65  ackedRecord obje
10570 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
10580 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
10590 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70 61 63  ckedRecord(Unpac
105a0 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
105b0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
105c0 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ( p->flags & UNP
105d0 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
105e0 4f 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OY ){.      int 
105f0 69 3b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d  i;.      Mem *pM
10600 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  em;.      for(i=
10610 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b  0, pMem=p->aMem;
10620 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b   i<p->nField; i+
10630 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20  +, pMem++){.    
10640 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
10650 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
10660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
10670 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
10680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10690 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
106a0 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  p->flags & UNPAC
106b0 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 29 7b  KED_NEED_FREE ){
106c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
106d0 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f  Free(p->pKeyInfo
106e0 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  ->db, p);.    }.
106f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
10700 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
10710 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
10720 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
10730 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
10740 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
10750 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
10760 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
10770 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
10780 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
10790 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
107a0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
107b0 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
107c0 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
107d0 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
107e0 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
107f0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
10800 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
10810 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
10820 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
10830 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
10840 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
10850 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
10860 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
10870 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
10880 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
10890 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
108a0 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
108b0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
108c0 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20   fields..** The 
108d0 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66  key with fewer f
108e0 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79  ields is usually
108f0 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74   compares less t
10900 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67  han the .** long
10910 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72  er key.  However
10920 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
10930 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69  _INCRKEY flags i
10940 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a  n pPKey2 is set.
10950 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  ** and the commo
10960 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65  n prefixes are e
10970 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20  qual, then key1 
10980 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79  is less than key
10990 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20  2..** Or if the 
109a0 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50  UNPACKED_MATCH_P
109b0 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65  REFIX flag is se
109c0 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78  t and the prefix
109d0 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  es are.** equal,
109e0 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61   then the keys a
109f0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
10a00 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a   be equal and.**
10a10 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e   the parts beyon
10a20 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
10a30 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  fix are ignored.
10a40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e  .**.** If the UN
10a50 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
10a60 57 49 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c  WID flag is set,
10a70 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 62   then the last b
10a80 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65  yte of.** the he
10a90 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69 73  ader of pKey1 is
10aa0 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69 73   ignored.  It is
10ab0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 70 4b   assumed that pK
10ac0 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64  ey1 is.** an ind
10ad0 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75 73  ex key, and thus
10ae0 20 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f 77   ends with a row
10af0 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20 6c  id value.  The l
10b00 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  ast byte.** of t
10b10 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20 74  he header will t
10b20 68 65 72 65 66 6f 72 65 20 62 65 20 74 68 65 20  herefore be the 
10b30 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  serial type of t
10b40 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65  he rowid:.** one
10b50 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   of 1, 2, 3, 4, 
10b60 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20  5, 6, 8, or 9 - 
10b70 74 68 65 20 69 6e 74 65 67 65 72 20 73 65 72 69  the integer seri
10b80 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65  al types..** The
10b90 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
10ba0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
10bb0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61  will always be a
10bc0 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a   single byte..**
10bd0 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 69   By ignoring thi
10be0 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74  s last byte of t
10bf0 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 66 6f  he header, we fo
10c00 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  rce the comparis
10c10 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  on.** to ignore 
10c20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
10c30 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f   end of key1..*/
10c40 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10c50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
10c60 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
10c70 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
10c80 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
10c90 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
10ca0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
10cb0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
10cc0 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20 20  .  int d1;      
10cd0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
10ce0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
10cf0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
10d00 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
10d10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
10d20 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
10d30 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
10d40 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
10d50 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
10d60 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10d70 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
10d80 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
10d90 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
10da0 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
10db0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
10dc0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
10dd0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
10de0 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
10df0 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
10e00 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
10e10 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
10e20 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  nfo;.  mem1.enc 
10e30 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
10e40 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
10e50 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d  yInfo->db;.  mem
10e60 31 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d  1.flags = 0;.  m
10e70 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  em1.zMalloc = 0;
10e80 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
10e90 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
10ea0 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
10eb0 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70 50  szHdr1;.  if( pP
10ec0 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
10ed0 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
10ee0 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64 72  WID ){.    szHdr
10ef0 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c  1--;.  }.  nFiel
10f00 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
10f10 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69  ield;.  while( i
10f20 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
10f30 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
10f40 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
10f50 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
10f60 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
10f70 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
10f80 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
10f90 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
10fa0 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
10fb0 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
10fc0 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
10fd0 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79      if( d1>=nKey
10fe0 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  1 && sqlite3Vdbe
10ff0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
11000 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20  rial_type1)>0 ) 
11010 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45  break;..    /* E
11020 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
11030 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
11040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
11050 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
11060 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
11070 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
11080 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
11090 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
110a0 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
110b0 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
110c0 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
110d0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20  Key2->aMem[i],. 
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65            i<nFie
11100 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ld ? pKeyInfo->a
11110 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
11120 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
11130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11140 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20  }.    i++;.  }. 
11150 20 69 66 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f   if( mem1.zMallo
11160 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
11170 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
11180 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  ;..  if( rc==0 )
11190 7b 0a 20 20 20 20 2f 2a 20 72 63 3d 3d 30 20 68  {.    /* rc==0 h
111a0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
111b0 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
111c0 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
111d0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 6c 6c 20   and.    ** all 
111e0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
111f0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
11200 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55   equal. If the U
11210 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a  NPACKED_INCRKEY.
11220 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
11230 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74  et, then break t
11240 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74 69  he tie by treati
11250 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65  ng key2 as large
11260 72 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  r..    ** If the
11270 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f   UPACKED_PREFIX_
11280 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65  MATCH flag is se
11290 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74  t, then keys wit
112a0 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  h common prefixe
112b0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6e  s.    ** are con
112c0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71  sidered to be eq
112d0 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ual.  Otherwise,
112e0 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20   the longer key 
112f0 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 6c  is the .    ** l
11300 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61  arger.  As it ha
11310 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79  ppens, the pPKey
11320 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
11330 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 20 20   the longer.    
11340 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ** if there is a
11350 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 20   difference..   
11360 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 4b 65   */.    if( pPKe
11370 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
11380 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a  CKED_INCRKEY ){.
11390 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
113a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b     }else if( pPK
113b0 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
113c0 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
113d0 43 48 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c  CH ){.      /* L
113e0 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20  eave rc==0 */.  
113f0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 31    }else if( idx1
11400 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20 20  <szHdr1 ){.     
11410 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
11420 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
11430 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
11440 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  && i<pKeyInfo->n
11450 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20  Field.          
11460 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f       && pKeyInfo
11470 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
11480 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b  ){.    rc = -rc;
11490 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
114a0 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 43  c;.}. ../*.** pC
114b0 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
114c0 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
114d0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
114e0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
114f0 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
11500 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
11510 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
11520 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
11530 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
11540 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11550 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
11560 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
11570 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
11580 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11590 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43  VdbeIdxRowid(BtC
115a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
115b0 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
115c0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
115d0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
115e0 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
115f0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
11600 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
11610 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
11620 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
11630 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
11640 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
11650 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
11660 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
11670 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
11680 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
11690 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e  ellKey);.  if( n
116a0 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
116b0 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
116c0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
116d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
116e0 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 2e 66 6c 61  KPT;.  }.  m.fla
116f0 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62 20 3d  gs = 0;.  m.db =
11700 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20   0;.  m.zMalloc 
11710 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
11720 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
11730 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e  ree(pCur, 0, (in
11740 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  t)nCellKey, 1, &
11750 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
11760 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11770 20 7d 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61   }.  (void)getVa
11780 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c  rint32((u8*)m.z,
11790 20 73 7a 48 64 72 29 3b 0a 20 20 28 76 6f 69 64   szHdr);.  (void
117a0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
117b0 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
117c0 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c   typeRowid);.  l
117d0 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
117e0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
117f0 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  en(typeRowid);. 
11800 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11810 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
11820 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
11830 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
11840 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
11850 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
11860 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
11870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
11890 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
118a0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
118b0 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
118c0 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74  point to against
118d0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
118e0 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c  ng in pKey (of l
118f0 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72  ength nKey).  Wr
11900 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
11910 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
11920 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
11930 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
11940 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
11950 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
11960 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
11970 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51  pKey.  Return SQ
11980 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
11990 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69  ss..**.** pKey i
119a0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
119b0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
119c0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
119d0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
119e0 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
119f0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
11a00 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
11a10 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
11a20 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
11a30 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
11a40 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
11a50 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
11a60 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
11a70 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
11a80 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
11a90 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
11aa0 69 72 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 70  ire key..**.** p
11ab0 55 6e 70 61 63 6b 65 64 20 6d 61 79 20 62 65 20  Unpacked may be 
11ac0 61 6e 20 75 6e 70 61 63 6b 65 64 20 76 65 72 73  an unpacked vers
11ad0 69 6f 6e 20 6f 66 20 70 4b 65 79 2c 6e 4b 65 79  ion of pKey,nKey
11ae0 2e 20 20 49 66 20 70 55 6e 70 61 63 6b 65 64 20  .  If pUnpacked 
11af0 69 73 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 69  is.** supplied i
11b00 74 20 69 73 20 75 73 65 64 20 69 6e 20 70 6c 61  t is used in pla
11b10 63 65 20 6f 66 20 70 4b 65 79 2c 6e 4b 65 79 2e  ce of pKey,nKey.
11b20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11b30 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
11b40 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  (.  VdbeCursor *
11b50 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
11b60 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
11b70 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
11b80 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
11b90 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
11ba0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
11bb0 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 61 6e  rsion of pKey an
11bc0 64 20 6e 4b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  d nKey */.  int 
11bd0 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
11be0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11bf0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
11c00 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
11c10 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
11c20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
11c30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11c40 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
11c50 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69    Mem m;..  sqli
11c60 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
11c70 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
11c80 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
11c90 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
11ca0 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
11cb0 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
11cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11cd0 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d 20 30  ;.  }.  m.db = 0
11ce0 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b  ;.  m.flags = 0;
11cf0 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  .  m.zMalloc = 0
11d00 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11d10 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
11d20 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
11d30 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
11d40 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
11d50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11d60 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
11d70 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67   pUnpacked->flag
11d80 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
11d90 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a  ORE_ROWID );.  *
11da0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
11db0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
11dc0 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
11dd0 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
11de0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
11df0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11e00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
11e10 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
11e20 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
11e30 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
11e40 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
11e50 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
11e60 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
11e70 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
11e80 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
11e90 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
11ea0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
11eb0 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
11ec0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11ed0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
11ee0 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
11ef0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
11f00 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
11f10 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
11f20 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
11f30 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
11f40 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
11f50 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
11f60 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
11f70 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
11f80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
11f90 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
11fa0 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
11fb0 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
11fc0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
11fd0 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
11fe0 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
11ff0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
12000 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
12010 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
12020 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
12030 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
12040 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
12050 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
12060 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
12070 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
12080 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
12090 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
120a0 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
120b0 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
120c0 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
120d0 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
120e0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
120f0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
12100 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
12110 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
12120 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
12130 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
12140 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
12150 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
12160 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12170 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
12180 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
12190 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
121a0 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
121b0 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
121c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
121d0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
121e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
121f0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
12200 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12210 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
12220 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
12230 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
12240 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a           urn v->db;.}.