/ Hex Artifact Content
Login

Artifact 5356c9bbac2fb0cb75b816de1d5963b26547f656:


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 36 20 32  eaux.c,v 1.426 2
02c0: 30 30 38 2f 31 32 2f 31 30 20 31 39 3a 32 36 3a  008/12/10 19:26:
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 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
3e70: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
3e80: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
3e90: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
3ea0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
3eb0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
3ec0: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23  YNAMIC;.  }.}..#
3ed0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
3ee0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
3ef0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68  omment on the th
3f00: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3f10: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
3f20: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
3f30: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
3f40: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
3f50: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
3f60: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
3f70: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
3f80: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
3f90: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
3fa0: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
3fb0: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
3fc0: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
3fd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3fe0: 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  beComment(Vdbe *
3ff0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4000: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
4010: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 61 73  va_list ap;.  as
4020: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
4030: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
4040: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
4050: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
4060: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
4070: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
4080: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
4090: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
40a0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d   char **pz = &p-
40b0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
40c0: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f  Comment;.    va_
40d0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
40e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  t);.    sqlite3D
40f0: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a  bFree(p->db, *pz
4100: 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c  );.    *pz = sql
4110: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
4120: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
4130: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
4140: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
4150: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
4160: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
4170: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
4180: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
4190: 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 56  t ap;.  sqlite3V
41a0: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
41b0: 4e 6f 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28  Noop);.  assert(
41c0: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
41d0: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
41e0: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
41f0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
4200: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
4210: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
4220: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
4230: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72  >nOp ){.    char
4240: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b   **pz = &p->aOp[
4250: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
4260: 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  nt;.    va_start
4270: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
4280: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4290: 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20  (p->db, *pz);.  
42a0: 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56    *pz = sqlite3V
42b0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
42c0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
42d0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
42e0: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
42f0: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EBUG */../*.** R
4300: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
4310: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
4320: 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  ress..*/.VdbeOp 
4330: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
4340: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
4350: 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ddr){.  assert( 
4360: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4370: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
4380: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
4390: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
43a0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
43b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 65 74 75  Failed );.  retu
43c0: 72 6e 20 28 28 61 64 64 72 3e 3d 30 20 26 26 20  rn ((addr>=0 && 
43d0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70  addr<p->nOp)?(&p
43e0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b  ->aOp[addr]):0);
43f0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
4400: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
4410: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
4420: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
4430: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
4440: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
4450: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4460: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
4470: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
4480: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
4490: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
44a0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
44b0: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
44c0: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
44d0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
44e0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
44f0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
4500: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
4510: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
4520: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
4530: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
4540: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
4550: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
4560: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
4570: 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20  NFO_STATIC:.    
4580: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
4590: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
45a0: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
45b0: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
45c0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
45d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
45e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
45f0: 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22  mp, "keyinfo(%d"
4600: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
4610: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
4620: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4630: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
4640: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
4650: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
4660: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
4670: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
4680: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
4690: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29       if( pColl )
46a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
46b0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
46c0: 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  n30(pColl->zName
46d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
46e0: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
4700: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
4710: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
4720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4740: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c   zTemp[i++] = ',
4750: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
4760: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4770: 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66  Order && pKeyInf
4780: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
4790: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
47a0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
47b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
47c0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
47d0: 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d  zTemp[i], pColl-
47e0: 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20  >zName,n+1);.   
47f0: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
4800: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
4810: 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+4<nTemp-6 ){.
4820: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
4830: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c  (&zTemp[i],",nil
4840: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
4850: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
4860: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4870: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27  zTemp[i++] = ')'
4880: 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d  ;.      zTemp[i]
4890: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
48a0: 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20  rt( i<nTemp );. 
48b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
48c0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  }.    case P4_CO
48d0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
48e0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
48f0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4910: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4920: 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32  mp, "collseq(%.2
4930: 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  0s)", pColl->zNa
4940: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
4950: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4960: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
4970: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
4980: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75  ef = pOp->p4.pFu
4990: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
49a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
49b0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
49c0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
49d0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
49e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
49f0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
4a00: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
4a10: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4a20: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
4a30: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
4a40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4a50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4a60: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
4a70: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4a80: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4a90: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
4aa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ab0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
4ac0: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
4ad0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4ae0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
4af0: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
4b00: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
4b10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4b20: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
4b30: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
4b40: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
4b50: 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
4b60: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
4b70: 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ll)==0 );.      
4b80: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4b90: 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
4ba0: 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d       zP4 = pMem-
4bb0: 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  >z;.      }else 
4bc0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4bd0: 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
4be0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4bf0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4c00: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  mp, "%lld", pMem
4c10: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
4c20: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
4c30: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
4c40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4c50: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4c60: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
4c70: 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20  , pMem->r);.    
4c80: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4c90: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
4ca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4cb0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
4cc0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
4cd0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
4ce0: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
4cf0: 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  pVtab;.      sql
4d00: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4d10: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61  emp, zTemp, "vta
4d20: 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c  b:%p:%p", pVtab,
4d30: 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29   pVtab->pModule)
4d40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4d50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4d60: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
4d70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4d80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4d90: 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72  , zTemp, "intarr
4da0: 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ay");.      brea
4db0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
4dc0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
4dd0: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
4de0: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
4df0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
4e00: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
4e10: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
4e20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4e30: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
4e40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
4e50: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4e60: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
4e70: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
4e80: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
4e90: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
4ea0: 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71  d..**.*/.void sq
4eb0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
4ec0: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
4ed0: 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  i){.  int mask;.
4ee0: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
4ef0: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29  & i<p->db->nDb )
4f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
4f10: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
4f20: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d  eeMask)*8 );.  m
4f30: 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20 20 69 66  ask = 1<<i;.  if
4f40: 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ( (p->btreeMask 
4f50: 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
4f60: 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c    p->btreeMask |
4f70: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69  = mask;.    sqli
4f80: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
4f90: 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61 4d 75  ayInsert(&p->aMu
4fa0: 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44 62 5b  tex, p->db->aDb[
4fb0: 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  i].pBt);.  }.}..
4fc0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
4fd0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
4fe0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
4ff0: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
5000: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
5010: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
5020: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
5030: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
5040: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
5050: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
5060: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
5070: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b  p){.  char *zP4;
5080: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
5090: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
50a0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
50b0: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
50c0: 20 25 34 64 20 25 34 64 20 25 2d 34 73 20 25 2e   %4d %4d %-4s %.
50d0: 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  2X %s\n";.  if( 
50e0: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
50f0: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d   stdout;.  zP4 =
5100: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
5110: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
5120: 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 70  r));.  fprintf(p
5130: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
5140: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
5150: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
5160: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
5170: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
5180: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
5190: 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  5,.#ifdef SQLITE
51a0: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 70  _DEBUG.      pOp
51b0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70  ->zComment ? pOp
51c0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a  ->zComment : "".
51d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22 0a 23  #else.      "".#
51e0: 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c  endif.  );.  ffl
51f0: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
5200: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
5210: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
5220: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
5230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
5240: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
5250: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
5260: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
5270: 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20   Mem *pEnd;.    
5280: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
5290: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  >db;.    u8 mall
52a0: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
52b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
52c0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
52d0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
52e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
52f0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
5300: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
5310: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
5320: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
5330: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
5340: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
5350: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
5360: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
5370: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
5380: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
5390: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
53a0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
53b0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
53c0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
53d0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
53e0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
53f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
5400: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
5410: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
5420: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
5430: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
5440: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
5450: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
5460: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
5470: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
5480: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
5490: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
54a0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
54b0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
54c0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
54d0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
54e0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
54f0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
5500: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
5510: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
5520: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
5530: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
5540: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
5550: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
5560: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
5570: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
5580: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
5590: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
55a0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
55b0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
55c0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
55d0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
55e0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
55f0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
5600: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29  MEM_Agg|MEM_Dyn)
5610: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5620: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
5630: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
5640: 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e if( p->zMalloc
5650: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5660: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
5670: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
5680: 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20     p->zMalloc = 
5690: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
56a0: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
56b0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _Null;.    }.   
56c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
56d0: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
56e0: 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66  d;.  }.}..#ifdef
56f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
5700: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
5710: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
5720: 52 65 6c 65 61 73 65 42 75 66 66 65 72 73 28 56  ReleaseBuffers(V
5730: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
5740: 69 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 20 3d  i;.  int nFree =
5750: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
5760: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5770: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
5780: 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
5790: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29  <=p->nMem; ii++)
57a0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
57b0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a  = &p->aMem[ii];.
57c0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
57d0: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
57e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
57f0: 33 52 6f 77 53 65 74 43 6c 65 61 72 28 70 4d 65  3RowSetClear(pMe
5800: 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20  m->u.pRowSet);. 
5810: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 65     }.    if( pMe
5820: 6d 2d 3e 7a 20 26 26 20 70 4d 65 6d 2d 3e 66 6c  m->z && pMem->fl
5830: 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20  ags&MEM_Dyn ){. 
5840: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4d       assert( !pM
5850: 65 6d 2d 3e 78 44 65 6c 20 29 3b 0a 20 20 20 20  em->xDel );.    
5860: 20 20 6e 46 72 65 65 20 2b 3d 20 73 71 6c 69 74    nFree += sqlit
5870: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
5880: 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a  Mem->db, pMem->z
5890: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
58a0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
58b0: 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mem);.    }.  }.
58c0: 20 20 72 65 74 75 72 6e 20 6e 46 72 65 65 3b 0a    return nFree;.
58d0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
58e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
58f0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
5900: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
5910: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
5920: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
5930: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
5940: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
5950: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
5960: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
5970: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
5980: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
5990: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
59a0: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
59b0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
59c0: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
59d0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
59e0: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
59f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
5a00: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
5a10: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
5a20: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
5a30: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
5a40: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
5a50: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
5a60: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
5a70: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
5a80: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
5a90: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
5aa0: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
5ab0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
5ac0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
5ad0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
5ae0: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
5b10: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
5b20: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
5b30: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
5b40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
5b50: 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73   *pMem = p->pRes
5b60: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
5b70: 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  m[1];..  assert(
5b80: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
5b90: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
5ba0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20  DBE_MAGIC_RUN ) 
5bb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5bc0: 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  SUSE;.  assert( 
5bd0: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
5be0: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a  E_MAGIC_BUSY );.
5bf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
5c00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
5c10: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
5c20: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
5c30: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
5c40: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
5c50: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
5c60: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
5c70: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
5c80: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
5c90: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
5ca0: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
5cb0: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
5cc0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
5cd0: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
5ce0: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
5cf0: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
5d00: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
5d10: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
5d20: 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 0a 20  em, p->nMem);.. 
5d30: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
5d40: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
5d50: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
5d60: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
5d70: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
5d80: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
5d90: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
5da0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
5db0: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
5dc0: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
5dd0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
5de0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
5df0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
5e00: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
5e10: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d  ;.  }while( i<p-
5e20: 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61  >nOp && p->expla
5e30: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
5e40: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
5e50: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
5e60: 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  >=p->nOp ){.    
5e70: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
5e80: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
5e90: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
5ea0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
5eb0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
5ec0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
5ed0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
5ee0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
5f00: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
5f10: 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71  sg, db, "%s", sq
5f20: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
5f30: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
5f40: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f    char *z;.    O
5f50: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
5f60: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
5f70: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
5f80: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5f90: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
5fa0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5fb0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5fc0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
5fd0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
6000: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  nter */.      pM
6010: 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70  em++;.  .      p
6020: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
6030: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
6040: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
6050: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
6060: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
6070: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
6080: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
6090: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
60a0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
60b0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
60c0: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
60d0: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
60e0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
60f0: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
6100: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
6110: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
6120: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  ;.    }..    pMe
6130: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
6140: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
6150: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
6180: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
6190: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
61a0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
61b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
61c0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
61d0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
6200: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
6210: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
6220: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
6230: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
6240: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
6250: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
6260: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
6270: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
6280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
62a0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
62b0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
62c0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
62d0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
62e0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
62f0: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
6300: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
6310: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
6320: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6330: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
6340: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6350: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
6360: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
6370: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
6380: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
6390: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
63a0: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
63b0: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
63c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
63d0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
63e0: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
63f0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
6400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
6410: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
6420: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
6430: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6440: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
6450: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
6460: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
6470: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
6480: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
6490: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
64a0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
64b0: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
64c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
64d0: 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b  w(pMem, 4, 0) ){
64e0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e  .        p->db->
64f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
6500: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6510: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
6530: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
6540: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
6550: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
6560: 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  >n = 2;.      sq
6570: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
6580: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78  , pMem->z, "%.2x
6590: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
65a0: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P5 */.      pM
65b0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
65c0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
65d0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
65e0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
65f0: 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53  m++;.  .#ifdef S
6600: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
6610: 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d    if( pOp->zComm
6620: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ent ){.        p
6630: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
6640: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
6650: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d         pMem->z =
6660: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a   pOp->zComment;.
6670: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
6680: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6690: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
66a0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
66b0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
66c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
66d0: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
66e0: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
66f0: 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
6700: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
6710: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20  /* Comment */.  
6740: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
6750: 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a   = SQLITE_NULL;.
6760: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
6770: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
6780: 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70   = 8 - 5*(p->exp
6790: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
67a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
67b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
67c0: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
67d0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
67e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
67f0: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
6800: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
6810: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
6820: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
6830: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
6840: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
6850: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
6860: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
6870: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
6880: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
6890: 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  pOp;.  if( nOp<1
68a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
68b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
68c0: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
68d0: 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f  ==OP_Trace && pO
68e0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
68f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
6900: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
6910: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
6920: 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a  *(u8*)z) ) z++;.
6930: 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a      printf("SQL:
6940: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20   [%s]\n", z);.  
6950: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
6960: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6970: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
6980: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6990: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
69a0: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
69b0: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
69c0: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
69d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
69e0: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
69f0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6a00: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
6a10: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
6a20: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
6a30: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
6a40: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
6a50: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
6a60: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
6a70: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54  Op->opcode==OP_T
6a80: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e  race && pOp->p4.
6a90: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
6aa0: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
6ab0: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
6ac0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
6ad0: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
6ae0: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
6af0: 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63   for(i=0; isspac
6b00: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
6b10: 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  )z[i]); i++){}. 
6b20: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
6b30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6b40: 28 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ( isspace((unsig
6b50: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29  ned char)z[i]) )
6b60: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
6b70: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
6b80: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
6b90: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
6ba0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6bb0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
6bc0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
6bd0: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
6be0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
6bf0: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
6c00: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
6c10: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
6c20: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
6c30: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
6c40: 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  .../*.** Prepare
6c50: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
6c60: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
6c70: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
6c80: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
6c90: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
6ca0: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
6cb0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
6cc0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
6cd0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
6ce0: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
6cf0: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
6d00: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
6d10: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
6d20: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
6d30: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
6d40: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
6d50: 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66  to move a VDBE f
6d60: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  rom VDBE_MAGIC_I
6d70: 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  NIT to.** VDBE_M
6d80: 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69  AGIC_RUN..*/.voi
6d90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
6da0: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
6db0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6dd0: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  VDBE */.  int nV
6de0: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
6df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6e00: 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e  er of '?' see in
6e10: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
6e20: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  nt */.  int nMem
6e30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6e50: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
6e60: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
6e70: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20    int nCursor,  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
6ea0: 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  rsors to allocat
6eb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70  e */.  int isExp
6ec0: 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  lain            
6ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
6ee0: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
6ef0: 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e 74  words is present
6f00: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
6f10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6f20: 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  p->db;..  assert
6f30: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
6f40: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
6f50: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
6f60: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
6f70: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
6f80: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
6f90: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6fa0: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
6fb0: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
6fc0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
6fd0: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
6fe0: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
6ff0: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
7000: 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72  C_RUN;..  /* For
7010: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
7020: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
7030: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
7040: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
7050: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
7060: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
7070: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
7080: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
7090: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
70a0: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
70b0: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
70c0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
70d0: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
70e0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
70f0: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
7100: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
7110: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
7120: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
7130: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
7140: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
7150: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
7160: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
7170: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
7180: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
7190: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
71a0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
71b0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
71c0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
71d0: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 0a 20  nCursor;..  /*. 
71e0: 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 73   ** Allocation s
71f0: 70 61 63 65 20 66 6f 72 20 72 65 67 69 73 74 65  pace for registe
7200: 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
7210: 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->aMem==0 ){.   
7220: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
7230: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
7240: 65 72 20 6f 66 20 61 72 67 73 20 70 61 73 73 65  er of args passe
7250: 64 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63  d to a user func
7260: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 73  tion. */.    res
7270: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
7280: 26 6e 41 72 67 29 3b 0a 20 20 20 20 61 73 73 65  &nArg);.    asse
7290: 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20  rt( nVar>=0 );. 
72a0: 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e     if( isExplain
72b0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
72c0: 20 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a       nMem = 10;.
72d0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65      }.    p->aMe
72e0: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
72f0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
7300: 20 20 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28      nMem*sizeof(
7310: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
7320: 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20     /* aMem */.  
7330: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
7340: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
7350: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
7360: 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
7370: 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20  eof(Mem*)       
7380: 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20         /* apArg 
7390: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
73a0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20  sizeof(char*)   
73b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56            /* azV
73c0: 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43  ar */.      + nC
73d0: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
73e0: 65 43 75 72 73 6f 72 2a 29 2b 31 20 20 2f 2a 20  eCursor*)+1  /* 
73f0: 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  apCsr */.    );.
7400: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
7410: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7420: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
7430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
7440: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
7450: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70  .nMem */.      p
7460: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
7470: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e        /*       n
7480: 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d  ot from 0..nMem-
7490: 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56  1 */.      p->aV
74a0: 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d  ar = &p->aMem[nM
74b0: 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  em+1];.      p->
74c0: 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20  nVar = nVar;.   
74d0: 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b     p->okVar = 0;
74e0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20  .      p->apArg 
74f0: 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61  = (Mem**)&p->aVa
7500: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
7510: 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a  ->azVar = (char*
7520: 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67  *)&p->apArg[nArg
7530: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73  ];.      p->apCs
7540: 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 2a  r = (VdbeCursor*
7550: 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72  *)&p->azVar[nVar
7560: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72  ];.      p->nCur
7570: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
7580: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c       for(n=0; n<
7590: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
75a0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
75b0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
75c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
75d0: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
75e0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e     }.      for(n
75f0: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b  =1; n<=nMem; n++
7600: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d  ){.        p->aM
7610: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
7620: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
7630: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
7640: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
7650: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
7660: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
7670: 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20  n=1; n<p->nMem; 
7680: 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  n++){.    assert
7690: 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d  ( p->aMem[n].db=
76a0: 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  =db );.  }.#endi
76b0: 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  f..  p->pc = -1;
76c0: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
76d0: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75  E_OK;.  p->uniqu
76e0: 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  eCnt = 0;.  p->e
76f0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
7700: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c  Abort;.  p->expl
7710: 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e  ain |= isExplain
7720: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
7730: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
7740: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
7750: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
7760: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
7770: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
7780: 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74  5;.  p->openedSt
7790: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66  atement = 0;.#if
77a0: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
77b0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
77c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
77d0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
77e0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
77f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
7800: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
7810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7820: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  if.}../*.** Clos
7830: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
7840: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
7850: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
7860: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
7870: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
7880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7890: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
78a0: 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72  e *p, VdbeCursor
78b0: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
78c0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
78d0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rn;.  }.  if( pC
78e0: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71  x->pBt ){.    sq
78f0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
7900: 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f  pCx->pBt);.    /
7910: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
7920: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
7930: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
7940: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
7950: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  .    ** the call
7960: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c   above. */.  }el
7970: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  se if( pCx->pCur
7980: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
7990: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
79a0: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
79b0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
79c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
79d0: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
79e0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
79f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
7a00: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
7a10: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
7a20: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
7a30: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
7a40: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
7a50: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
7a60: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
7a70: 3d 20 31 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  = 1;.    (void)s
7a80: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
7a90: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64  p->db);.    pMod
7aa0: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
7ab0: 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 28 76  bCursor);.    (v
7ac0: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
7ad0: 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  yOn(p->db);.    
7ae0: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
7af0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
7b00: 20 20 69 66 28 20 21 70 43 78 2d 3e 65 70 68 65    if( !pCx->ephe
7b10: 6d 50 73 65 75 64 6f 54 61 62 6c 65 20 29 7b 0a  mPseudoTable ){.
7b20: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7b30: 65 28 70 2d 3e 64 62 2c 20 70 43 78 2d 3e 70 44  e(p->db, pCx->pD
7b40: 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ata);.  }.}../*.
7b50: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
7b60: 73 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72 20  sors except for 
7b70: 56 54 61 62 20 63 75 72 73 6f 72 73 20 74 68 61  VTab cursors tha
7b80: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  t are currently.
7b90: 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  ** in use..*/.st
7ba0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
7bb0: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
7bc0: 63 74 69 76 65 56 74 61 62 73 28 56 64 62 65 20  ctiveVtabs(Vdbe 
7bd0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7be0: 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20  if( p->apCsr==0 
7bf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7c00: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
7c10: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64 62  r; i++){.    Vdb
7c20: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
7c30: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69  >apCsr[i];.    i
7c40: 66 28 20 70 43 20 26 26 20 28 21 70 2d 3e 69 6e  f( pC && (!p->in
7c50: 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70  VtabMethod || !p
7c60: 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 20  C->pVtabCursor) 
7c70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7c80: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
7c90: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e  , pC);.      p->
7ca0: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
7cb0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7cc0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
7cd0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
7ce0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7cf0: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61  tine will automa
7d00: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e  tically close an
7d10: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73  y cursors, lists
7d20: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74  , and/or.** sort
7d30: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65  ers that were le
7d40: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73  ft open.  It als
7d50: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61  o deletes the va
7d60: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61  lues of.** varia
7d70: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72  bles in the aVar
7d80: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
7d90: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
7da0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7db0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
7dc0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 4d 65 6d  b = p->db;.  Mem
7dd0: 20 2a 70 4d 65 6d 3b 0a 20 20 63 6c 6f 73 65 41   *pMem;.  closeA
7de0: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
7df0: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
7e00: 20 66 6f 72 28 70 4d 65 6d 3d 26 70 2d 3e 61 4d   for(pMem=&p->aM
7e10: 65 6d 5b 31 5d 2c 20 69 3d 31 3b 20 69 3c 3d 70  em[1], i=1; i<=p
7e20: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 2c 20 70 4d 65  ->nMem; i++, pMe
7e30: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  m++){.    if( pM
7e40: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7e50: 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 20 20  RowSet ){.      
7e60: 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65  sqlite3RowSetCle
7e70: 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53  ar(pMem->u.pRowS
7e80: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4d  et);.    }.    M
7e90: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d  emSetTypeFlag(pM
7ea0: 65 6d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  em, MEM_Null);. 
7eb0: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
7ec0: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
7ed0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 69 66  , p->nMem);.  if
7ee0: 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  ( p->contextStac
7ef0: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
7f00: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 63 6f  DbFree(db, p->co
7f10: 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d  ntextStack);.  }
7f20: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
7f30: 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e  ck = 0;.  p->con
7f40: 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d  textStackDepth =
7f50: 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74   0;.  p->context
7f60: 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20  StackTop = 0;.  
7f70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7f80: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
7f90: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
7fa0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
7fb0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
7fc0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
7fd0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
7fe0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
7ff0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
8000: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
8010: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
8020: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
8030: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
8040: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
8050: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
8060: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
8070: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
8080: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
8090: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
80a0: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
80b0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
80c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
80d0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
80e0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
80f0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
8100: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
8110: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8120: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
8130: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
8140: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
8150: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
8160: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8170: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
8180: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
8190: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
81a0: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
81b0: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20   = nResColumn;. 
81c0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
81d0: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
81e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
81f0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
8200: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
8210: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
8220: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
8230: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
8240: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
8250: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
8260: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
8270: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
8280: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
8290: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
82a0: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
82b0: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
82c0: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
82d0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
82e0: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
82f0: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
8300: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
8310: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
8320: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
8330: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
8340: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
8350: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
8360: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
8370: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
8380: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
8390: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
83a0: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
83b0: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
83c0: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
83d0: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
83e0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
83f0: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
8400: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
8410: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
8420: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
8430: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
8440: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8450: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
8460: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
8480: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
8490: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
84a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
84b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
84c0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
84d0: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
84e0: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
8510: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
8520: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
8530: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
8540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8550: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
8560: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
8570: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
8580: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
8590: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
85a0: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
85b0: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
85c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
85d0: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
85e0: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
85f0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
8600: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
8610: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
8620: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8630: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
8640: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
8650: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
8660: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
8670: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8680: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
8690: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
86a0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
86b0: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
86c0: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
86d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
86e0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
86f0: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
8700: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
8710: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
8720: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
8730: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
8740: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
8750: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
8760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
8770: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
8780: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
8790: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
87a0: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
87b0: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
87c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
87d0: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
87e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
87f0: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
8800: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
8810: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
8820: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
8830: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
8840: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
8850: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
8860: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
8870: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
8880: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
8890: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
88a0: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
88b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
88c0: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
88d0: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
88e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
88f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8900: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
8910: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42  mit = 0;..  /* B
8920: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
8930: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
8940: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
8950: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
8960: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
8970: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
8980: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
8990: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
89a0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
89b0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
89c0: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
89d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
89e0: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
89f0: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
8a00: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
8a10: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
8a20: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
8a30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
8a40: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
8a50: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26  e3VtabSync(db, &
8a60: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  p->zErrMsg);.  i
8a70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8a80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8a90: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
8aa0: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
8ab0: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
8ac0: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
8ad0: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
8ae0: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
8af0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
8b00: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
8b10: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
8b20: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
8b30: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
8b40: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
8b50: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
8b60: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
8b70: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
8b80: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
8b90: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
8ba0: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
8bb0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
8bc0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
8bd0: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
8be0: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
8bf0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
8c00: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
8c10: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8c20: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
8c30: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
8c40: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
8c50: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
8c60: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
8c70: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
8c80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8c90: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
8ca0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
8cb0: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
8cc0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
8cd0: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
8ce0: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
8cf0: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
8d00: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
8d10: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
8d20: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
8d30: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
8d40: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28  ommitArg);.    (
8d50: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
8d60: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
8d70: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8d80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
8d90: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
8da0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
8db0: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
8dc0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
8dd0: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
8de0: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
8df0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
8e00: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
8e10: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
8e20: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
8e30: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
8e40: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
8e50: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
8e60: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
8e70: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
8e80: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
8e90: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
8ea0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
8eb0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
8ec0: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
8ed0: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
8ee0: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
8ef0: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
8f00: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
8f10: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
8f20: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
8f30: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
8f40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
8f50: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
8f60: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
8f70: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
8f80: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
8f90: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
8fa0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
8fb0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
8fc0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
8fd0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8fe0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8ff0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
9000: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9010: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9020: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
9030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9040: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
9050: 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
9060: 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
9070: 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
9080: 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
9090: 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
90a0: 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
90b0: 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
90c0: 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
90d0: 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
90e0: 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
90f0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
9100: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
9110: 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
9120: 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
9130: 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
9140: 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
9150: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
9160: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
9170: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9180: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
9190: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
91a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
91b0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
91c0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
91d0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
91e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
91f0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9200: 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20  Two(pBt);.      
9210: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9220: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
9240: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
9250: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
9260: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
9270: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
9280: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
9290: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
92a0: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
92b0: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
92c0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
92d0: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
92e0: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
92f0: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
9300: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
9310: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
9320: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
9330: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
9340: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
9350: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
9360: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
9370: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
9380: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
9390: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
93a0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
93b0: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
93c0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
93d0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
93e0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
93f0: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
9400: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
9410: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
9420: 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  res;..    /* Sel
9430: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
9440: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
9450: 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
9460: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
9470: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9480: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
9490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
94a0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
94b0: 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
94c0: 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74  om);.      zMast
94d0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
94e0: 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30  ntf(db, "%s-mj%0
94f0: 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20  8X", zMainFile, 
9500: 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66  iRandom&0x7fffff
9510: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ff);.      if( !
9520: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  zMaster ){.     
9530: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9540: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
9550: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9560: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
9570: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
9580: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
9590: 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
95a0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
95b0: 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
95c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
95d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
95e0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
95f0: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
9600: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
9610: 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
9620: 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
9630: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
9640: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
9650: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
9660: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
9670: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
9680: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
9690: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
96a0: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
96b0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
96c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
96d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
96e0: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
96f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9700: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
9710: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
9720: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
9730: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
9740: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
9750: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
9760: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
9770: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9780: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
9790: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
97a0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
97b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
97c0: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
97d0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
97e0: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
97f0: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
9800: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9810: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
9820: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
9830: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
9840: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
9850: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
9860: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
9870: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9880: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
9890: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
98a0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  t;.      if( i==
98b0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  1 ) continue;   
98c0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45  /* Ignore the TE
98d0: 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
98e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
98f0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
9900: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
9910: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
9920: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
9930: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
9940: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
9950: 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f  zFile[0]==0 ) co
9960: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
9970: 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  re :memory: data
9980: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
9990: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
99a0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
99b0: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
99c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
99d0: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
99e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
99f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9a00: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
9a10: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
9a20: 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
9a30: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
9a40: 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
9a50: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
9a60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
9a70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
9a90: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
9aa0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
9ab0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
9ac0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
9ad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9ae0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
9af0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
9b00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9b10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9b20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
9b30: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
9b40: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
9b50: 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
9b60: 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
9b70: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
9b80: 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
9b90: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  d..    */.    zM
9ba0: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
9bb0: 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65  3BtreeGetDirname
9bc0: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
9bd0: 3b 0a 20 20 20 20 69 66 28 20 28 6e 65 65 64 53  ;.    if( (needS
9be0: 79 6e 63 20 0a 20 20 20 20 20 26 26 20 28 30 3d  ync .     && (0=
9bf0: 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
9c00: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
9c10: 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
9c20: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
9c30: 4c 29 29 0a 20 20 20 20 20 26 26 20 28 72 63 3d  L)).     && (rc=
9c40: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
9c50: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
9c60: 4e 43 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c  NC_NORMAL))!=SQL
9c70: 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
9c80: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
9c90: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
9ca0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
9cb0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
9cc0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
9cd0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9ce0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
9cf0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
9d00: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
9d10: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
9d20: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
9d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
9d40: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
9d50: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
9d60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
9d70: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
9d80: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
9d90: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
9da0: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
9db0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
9dc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9dd0: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
9de0: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
9df0: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
9e00: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
9e10: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
9e20: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
9e30: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
9e40: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
9e50: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
9e60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
9e70: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
9e80: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
9e90: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
9ea0: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
9eb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9ec0: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
9ed0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9ee0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
9ef0: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
9f00: 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f   occured..    */
9f10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
9f20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
9f30: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
9f40: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
9f50: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9f60: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
9f70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
9f80: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
9f90: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
9fa0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
9fb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9fc0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
9fd0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  (pMaster);.    i
9fe0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9ff0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a000: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
a010: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
a020: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
a030: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
a040: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a050: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
a060: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
a070: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
a080: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
a090: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
a0a0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
a0b0: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
a0c0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
a0d0: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
a0e0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
a0f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
a100: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
a110: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
a120: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
a130: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
a140: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
a150: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
a160: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
a170: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
a180: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
a190: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
a1a0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
a1b0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
a1c0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
a1d0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
a1e0: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
a1f0: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
a200: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
a210: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
a220: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
a230: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
a240: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
a250: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
a260: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
a270: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
a280: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
a290: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
a2a0: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
a2b0: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
a2c0: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
a2d0: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
a2e0: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
a2f0: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
a300: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
a310: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
a320: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
a330: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
a340: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
a350: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a360: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
a370: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
a380: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
a390: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
a3a0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
a3b0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
a3c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
a3d0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
a3e0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
a3f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
a400: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a410: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
a420: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
a430: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
a440: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
a450: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
a460: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
a470: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
a480: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
a490: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
a4a0: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
a4b0: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
a4c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
a4d0: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
a4e0: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
a4f0: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
a500: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
a510: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
a520: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
a530: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
a540: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
a550: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
a560: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
a570: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
a580: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
a590: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
a5a0: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
a5b0: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
a5c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
a5d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
a5e0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
a5f0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
a600: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
a610: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
a620: 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ite = 0;.  p = d
a630: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
a640: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
a650: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
a660: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
a670: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
a680: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
a690: 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
a6a0: 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a  nWrite++;.    }.
a6b0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
a6c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a6d0: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56  cnt==db->activeV
a6e0: 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65  dbeCnt );.  asse
a6f0: 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
a700: 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a  writeVdbeCnt );.
a710: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
a720: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
a730: 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
a740: 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74  .** For every Bt
a750: 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61  ree that in data
a760: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
a770: 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  db which .** has
a780: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20   been modified, 
a790: 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69  "trip" or invali
a7a0: 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72  date each cursor
a7b0: 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65   in.** that Btre
a7c0: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
a7d0: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68  n modified so th
a7e0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
a7f0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73   can never be us
a800: 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20  ed again.  This 
a810: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72  happens when a r
a820: 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75  ollback.*** occu
a830: 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  rs.  We have to 
a840: 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68  trip all the oth
a850: 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e  er cursors, even
a860: 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20  .** cursor from 
a870: 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66  other VMs in dif
a880: 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  ferent database 
a890: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20  connections,.** 
a8a0: 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  so that none of 
a8b0: 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20  them try to use 
a8c0: 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63  the data at whic
a8d0: 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70  h they.** were p
a8e0: 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63  ointing and whic
a8f0: 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62  h now may have b
a900: 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a  een changed due.
a910: 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  ** to the rollba
a920: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62  ck..**.** Rememb
a930: 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61  er that a rollba
a940: 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61  ck can delete ta
a950: 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e  bles complete an
a960: 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f  d.** reorder roo
a970: 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69  tpages.  So it i
a980: 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
a990: 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a   just to save.**
a9a0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
a9b0: 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61  e cursor.  We ha
a9c0: 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ve to invalidate
a9d0: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73   the cursor.** s
a9e0: 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
a9f0: 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a  er used again..*
aa00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
aa10: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
aa20: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
aa30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
aa40: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
aa50: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
aa60: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
aa70: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
aa80: 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73  ;.    if( p && s
aa90: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
aaa0: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20  rans(p) ){.     
aab0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
aac0: 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53  pAllCursors(p, S
aad0: 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20  QLITE_ABORT);.  
aae0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
aaf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ab00: 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
ab10: 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
ab20: 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
ab30: 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
ab40: 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
ab50: 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
ab60: 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
ab70: 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
ab80: 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
ab90: 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
aba0: 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
abb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
abc0: 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
abd0: 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
abe0: 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
abf0: 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
ac00: 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
ac10: 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
ac20: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
ac30: 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
ac40: 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
ac50: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
ac60: 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
ac70: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
ac80: 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
ac90: 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
aca0: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
acb0: 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
acc0: 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
acd0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
ace0: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
acf0: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
ad00: 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
ad10: 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
ad20: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
ad30: 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
ad40: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
ad50: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
ad60: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
ad70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
ad80: 20 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20   (*xFunc)(Btree 
ad90: 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46  *pBt) = 0;  /* F
ada0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
adb0: 6f 6e 20 65 61 63 68 20 62 74 72 65 65 20 62 61  on each btree ba
adc0: 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ckend */.  int i
add0: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
ade0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
adf0: 20 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49   to true if SQLI
ae00: 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52  TE_NOMEM or IOER
ae10: 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  R */..  /* This 
ae20: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
ae30: 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
ae40: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
ae50: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
ae60: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
ae70: 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
ae80: 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
ae90: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
aea0: 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
aeb0: 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
aec0: 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
aed0: 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
aee0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
aef0: 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
af00: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
af10: 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
af20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
af30: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
af40: 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
af50: 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
af60: 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
af70: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
af80: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
af90: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
afa0: 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
afb0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
afc0: 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
afd0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
afe0: 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
aff0: 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
b000: 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
b010: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
b020: 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
b030: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
b040: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
b050: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b060: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b070: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f  NOMEM;.  }.  clo
b080: 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65  seAllCursorsExce
b090: 70 74 41 63 74 69 76 65 56 74 61 62 73 28 70 29  ptActiveVtabs(p)
b0a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
b0b0: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
b0c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b0d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
b0e0: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
b0f0: 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
b100: 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
b110: 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
b120: 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
b130: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28  started */.  if(
b140: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
b150: 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
b160: 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
b170: 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
b180: 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
b190: 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
b1a0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
b1b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
b1c0: 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72  eMutexArrayEnter
b1d0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20  (&p->aMutex);.. 
b1e0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
b1f0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
b200: 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
b210: 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
b220: 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
b230: 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
b240: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
b250: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
b260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b270: 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
b280: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
b290: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
b2a0: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
b2b0: 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
b2c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
b2d0: 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
b2e0: 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f  y, we need do no
b2f0: 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c   rollback at all
b300: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
b310: 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69     ** proceed wi
b320: 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68  th the special h
b330: 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a  andling..      *
b340: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
b350: 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
b360: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
b370: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
b380: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49   p->rc==SQLITE_I
b390: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20  OERR_BLOCKED && 
b3a0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
b3b0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
b3c0: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
b3d0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
b3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
b3f0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
b400: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
b410: 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
b420: 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
b430: 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20 20 20 20  LITE_FULL).     
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
b450: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
b460: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nal ){.         
b470: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
b480: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
b490: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
b4a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
b4b0: 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
b4c0: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
b4d0: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
b4e0: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
b4f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
b500: 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
b510: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
b520: 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
b530: 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
b540: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b550: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
b560: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
b570: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
b580: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
b590: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
b5a0: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
b5b0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
b5c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b5d0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
b5e0: 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
b5f0: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
b600: 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
b610: 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74 68   active vdbe, th
b620: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  en.    ** we do 
b630: 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
b640: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
b650: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
b660: 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
b670: 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
b680: 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
b690: 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
b6a0: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
b6b0: 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
b6c0: 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
b6d0: 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
b6e0: 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
b6f0: 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
b700: 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
b710: 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77  t .     && db->w
b720: 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d  riteVdbeCnt==(p-
b730: 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
b740: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
b750: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b760: 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
b770: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
b780: 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
b790: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
b7a0: 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
b7b0: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64  lag is true, and
b7c0: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
b7d0: 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a  m was .        *
b7e0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  * successful or 
b7f0: 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
b800: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69   constraint. Thi
b810: 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
b820: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20   .        ** is 
b830: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
b840: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
b850: 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
b860: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
b870: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b880: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
b890: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
b8a0: 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70  texArrayLeave(&p
b8b0: 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20  ->aMutex);.     
b8c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b8d0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
b8e0: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
b8f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b900: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
b910: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b920: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
b930: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
b940: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
b950: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
b960: 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
b970: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b990: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
b9a0: 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (db);.      }.  
b9b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75    }else if( !xFu
b9c0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nc ){.      if( 
b9d0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b9e0: 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
b9f0: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
ba00: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
ba10: 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b  enedStatement ){
ba20: 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63  .          xFunc
ba30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
ba40: 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20  ommitStmt;.     
ba50: 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73     } .      }els
ba60: 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
ba70: 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
ba80: 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63 20  {.        xFunc 
ba90: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
baa0: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
bab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bac0: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
bad0: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
bae0: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
baf0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
bb00: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
bb10: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
bb20: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
bb30: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78  }.  .    /* If x
bb40: 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Func is not NULL
bb50: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65  , then it is one
bb60: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
bb70: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a  RollbackStmt or.
bb80: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
bb90: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43  reeCommitStmt. C
bba0: 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65  all it once on e
bbb0: 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20  ach backend. If 
bbc0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  an error occurs.
bbd0: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72      ** and the r
bbe0: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74  eturn code is st
bbf0: 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73  ill SQLITE_OK, s
bc00: 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
bc10: 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20  de to the new.  
bc20: 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65    ** error value
bc30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
bc40: 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20  ert(!xFunc ||.  
bc50: 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74      xFunc==sqlit
bc60: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
bc70: 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63  t ||.      xFunc
bc80: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  ==sqlite3BtreeRo
bc90: 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29  llbackStmt.    )
bca0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78  ;.    for(i=0; x
bcb0: 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44  Func && i<db->nD
bcc0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
bcd0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74  int rc;.      Bt
bce0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
bcf0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
bd00: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
bd10: 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70      rc = xFunc(p
bd20: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
bd30: 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53   rc && (p->rc==S
bd40: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
bd50: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
bd60: 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20  AINT) ){.       
bd70: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
bd80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bd90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
bda0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
bdb0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
bdc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bdd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
bde0: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
bdf0: 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
be00: 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
be10: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61  the statement wa
be20: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20  s committed, .  
be30: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61    ** set the cha
be40: 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge counter. .  
be50: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
be60: 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70  changeCntOn && p
be70: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
be80: 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78   if( !xFunc || x
be90: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
bea0: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a  eeCommitStmt ){.
beb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bec0: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
bed0: 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
bee0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
bf00: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
bf10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bf20: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
bf30: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
bf40: 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  Rollback or comm
bf50: 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68  it any schema ch
bf60: 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  anges that occur
bf70: 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
bf80: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
bf90: 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51   && db->flags&SQ
bfa0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
bfb0: 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
bfc0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
bfd0: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
bfe0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d       db->flags =
bff0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51   (db->flags | SQ
c000: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
c010: 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  es);.    }..    
c020: 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
c030: 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
c040: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
c050: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
c060: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ex);.  }..  /* W
c070: 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
c080: 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
c090: 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
c0a0: 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
c0b0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
c0c0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63  =0 ){.    db->ac
c0d0: 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  tiveVdbeCnt--;. 
c0e0: 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
c0f0: 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  nly ){.      db-
c100: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b  >writeVdbeCnt--;
c110: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
c120: 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
c130: 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56  eCnt>=db->writeV
c140: 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20  dbeCnt );.  }.  
c150: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
c160: 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
c170: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
c180: 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
c190: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c1a0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
c1b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
c1c0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
c1d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
c1e0: 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
c1f0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
c200: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
c210: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
c220: 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
c230: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
c240: 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
c250: 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
c260: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c270: 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
c280: 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
c290: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
c2a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
c2b0: 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
c2c0: 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
c2d0: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
c2e0: 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
c2f0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
c300: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
c310: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
c320: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
c330: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
c340: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
c350: 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
c360: 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
c370: 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
c380: 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
c390: 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
c3a0: 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
c3b0: 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
c3c0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
c3d0: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
c3e0: 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
c3f0: 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
c400: 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
c410: 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
c420: 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
c430: 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
c440: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
c450: 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
c460: 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
c470: 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
c480: 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
c490: 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
c4a0: 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
c4b0: 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
c4c0: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
c4d0: 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
c4e0: 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
c4f0: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  now..  */.  (voi
c500: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
c510: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
c520: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 28  VdbeHalt(p);.  (
c530: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
c540: 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a  tyOff(db);..  /*
c550: 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
c560: 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
c570: 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
c580: 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
c590: 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
c5a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
c5b0: 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
c5c0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
c5d0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
c5e0: 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
c5f0: 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
c600: 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
c610: 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
c620: 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
c630: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
c640: 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
c650: 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
c660: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
c670: 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
c680: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
c690: 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d      if( p->zErrM
c6a0: 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
c6b0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
c6c0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
c6d0: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
c6e0: 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e  (db->pErr,-1,p->
c6f0: 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55  zErrMsg,SQLITE_U
c700: 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  TF8,SQLITE_TRANS
c710: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  IENT);.      sql
c720: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
c730: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d  loc();.      db-
c740: 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63  >errCode = p->rc
c750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
c760: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
c770: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rMsg);.      p->
c780: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
c790: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
c7a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c7b0: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
c7c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
c7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
c7e0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
c7f0: 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  K, 0);.    }.  }
c800: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
c810: 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
c820: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
c830: 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
c840: 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
c850: 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
c860: 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
c870: 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
c880: 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
c890: 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
c8a0: 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
c8b0: 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
c8c0: 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
c8d0: 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
c8e0: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
c8f0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
c900: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->rc, 0);.    sq
c910: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
c920: 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
c930: 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
c940: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
c950: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
c960: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c970: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
c980: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
c990: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
c9a0: 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
c9b0: 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
c9c0: 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
c9d0: 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
c9e0: 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
c9f0: 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
ca00: 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
ca10: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
ca20: 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
ca30: 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
ca40: 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
ca50: 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
ca60: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
ca70: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
ca80: 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
ca90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
caa0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
cab0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
cac0: 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
cad0: 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
cae0: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
caf0: 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
cb00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cb10: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
cb20: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
cb30: 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
cb40: 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
cb50: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
cb60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
cb70: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
cb80: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
cb90: 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
cba0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
cbb0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
cbc0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
cbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
cbe0: 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
cbf0: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
cc00: 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
cc10: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
cc20: 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
cc30: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
cc40: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
cc50: 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
cc60: 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
cc70: 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
cc80: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
cc90: 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
cca0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
ccb0: 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
ccc0: 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
ccd0: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
cce0: 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
ccf0: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
cd00: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
cd10: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
cd20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cd30: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
cd40: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
cd50: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
cd60: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
cd70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cd80: 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
cd90: 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
cda0: 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
cdb0: 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  =rc );.  }else i
cdc0: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
cdd0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
cde0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cdf0: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
ce00: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
ce10: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
ce20: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
ce30: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
ce40: 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
ce50: 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
ce60: 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
ce70: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
ce80: 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
ce90: 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
cea0: 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
ceb0: 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
cec0: 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
ced0: 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
cee0: 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
cef0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
cf00: 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
cf10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cf20: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
cf30: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
cf40: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
cf50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
cf60: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
cf70: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
cf80: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
cf90: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
cfa0: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
cfb0: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
cfc0: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29   !(mask&(1<<i)))
cfd0: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
cfe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
cff0: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
d000: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
d010: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
d020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
d030: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
d040: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d050: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
d060: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
d070: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
d080: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
d090: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
d0a0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20  db;..  if( p==0 
d0b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
d0c0: 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
d0d0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
d0e0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
d0f0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
d100: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
d110: 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
d120: 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
d130: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
d140: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
d150: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
d160: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
d170: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20   }.  if( p->aOp 
d180: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  ){.    Op *pOp =
d190: 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72   p->aOp;.    for
d1a0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
d1b0: 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i++, pOp++){.   
d1c0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
d1d0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
d1e0: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
d1f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
d200: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d210: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
d220: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
d230: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d240: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4f  DbFree(db, p->aO
d250: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  p);.  }.  releas
d260: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
d270: 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73  r, p->nVar);.  s
d280: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d290: 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 69   p->aLabel);.  i
d2a0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
d2b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d2c0: 64 62 2c 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29  db, &p->aMem[1])
d2d0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
d2e0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
d2f0: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
d300: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
d310: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d320: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
d330: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d340: 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  (db, p->zSql);. 
d350: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
d360: 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73  _MAGIC_DEAD;.  s
d370: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d380: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   p);.}../*.** If
d390: 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
d3a0: 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
d3b0: 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
d3c0: 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
d3d0: 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
d3e0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
d3f0: 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f   code.  If no Mo
d400: 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c  veTo is pending,
d410: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
d420: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e   does nothing an
d430: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
d440: 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
d450: 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
d460: 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
d470: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
d480: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
d490: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
d4a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
d4b0: 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
d4c0: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
d4d0: 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
d4e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
d4f0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
d500: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
d510: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
d520: 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
d530: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
d540: 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
d550: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d560: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
d570: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
d580: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
d590: 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
d5a0: 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a   = res==0 ?1:0;.
d5b0: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
d5c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d5d0: 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e  te3BtreeNext(p->
d5e0: 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
d5f0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
d600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
d610: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
d620: 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ST.    sqlite3_s
d630: 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
d640: 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66  endif.    p->def
d650: 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
d660: 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61  .    p->cacheSta
d670: 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
d680: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
d690: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
d6a0: 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20   int hasMoved;. 
d6b0: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
d6c0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
d6d0: 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
d6e0: 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20  r, &hasMoved);. 
d6f0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d700: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68  rn rc;.    if( h
d710: 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20  asMoved ){.     
d720: 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
d730: 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
d740: 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20       p->nullRow 
d750: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
d760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d770: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
d780: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
d790: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
d7a0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
d7b0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
d7c0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
d7d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
d7e0: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
d7f0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
d800: 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
d810: 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
d820: 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
d830: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
d840: 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
d850: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
d860: 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
d870: 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
d880: 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
d890: 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
d8a0: 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
d8b0: 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
d8c0: 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
d8d0: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
d8e0: 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
d8f0: 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
d900: 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
d910: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
d920: 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
d930: 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
d940: 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
d950: 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
d960: 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
d970: 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
d980: 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
d990: 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
d9a0: 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
d9b0: 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
d9c0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
d9d0: 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
d9e0: 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
d9f0: 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
da00: 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
da10: 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
da20: 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
da30: 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
da40: 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
da50: 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
da60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
da70: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
da80: 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
da90: 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
daa0: 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
dab0: 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
dac0: 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
dad0: 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
dae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
daf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
db00: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
db10: 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
db30: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
db40: 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
db60: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
db70: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
db80: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
db90: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
dba0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
dbb0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
dbe0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
dbf0: 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
dc10: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
dc20: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
dc30: 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
dc40: 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
dc50: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
dc60: 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
dc90: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
dca0: 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
dcb0: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
dcc0: 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
dcd0: 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
dd00: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
dd10: 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
dd40: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
dd50: 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
dd80: 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
dd90: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
dda0: 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
ddb0: 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
ddc0: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
ddd0: 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
dde0: 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
ddf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
de00: 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
de10: 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
de20: 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
de30: 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
de40: 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
de50: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
de60: 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
de70: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
de80: 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
de90: 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
dea0: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
deb0: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
dec0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
ded0: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
dee0: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
def0: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
df00: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
df10: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
df20: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
df30: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
df40: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
df50: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
df60: 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
df70: 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
df80: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
df90: 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
dfa0: 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
dfb0: 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
dfc0: 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
dfd0: 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
dfe0: 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d     if( file_form
dff0: 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d  at>=4 && (i&1)==
e000: 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  i ){.      retur
e010: 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20  n 8+(u32)i;.    
e020: 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20  }.    u = i<0 ? 
e030: 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20  -i : i;.    if( 
e040: 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
e050: 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
e060: 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
e070: 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
e080: 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
e090: 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
e0a0: 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
e0b0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
e0c0: 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
e0d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
e0e0: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
e0f0: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
e100: 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
e110: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
e120: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
e130: 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
e140: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
e150: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
e160: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
e170: 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
e180: 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
e190: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
e1a0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
e1b0: 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
e1c0: 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
e1d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
e1e0: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
e1f0: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
e200: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
e210: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
e220: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
e230: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
e240: 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
e250: 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
e260: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
e270: 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
e280: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
e290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
e2a0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
e2b0: 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
e2c0: 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
e2d0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
e2e0: 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
e2f0: 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
e300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
e310: 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
e320: 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
e330: 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
e340: 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
e350: 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
e360: 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
e370: 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
e380: 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
e390: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
e3a0: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
e3b0: 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
e3c0: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
e3d0: 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
e3e0: 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
e3f0: 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
e400: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
e410: 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
e420: 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
e430: 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
e440: 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
e450: 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
e460: 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
e470: 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
e480: 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
e490: 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
e4a0: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
e4b0: 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
e4c0: 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
e4d0: 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
e4e0: 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
e4f0: 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
e500: 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
e510: 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
e520: 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
e530: 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
e540: 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
e550: 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
e560: 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
e570: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
e580: 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
e590: 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
e5a0: 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
e5b0: 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
e5c0: 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
e5d0: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
e5e0: 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
e5f0: 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
e600: 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
e610: 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
e620: 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
e630: 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
e640: 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
e650: 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
e660: 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
e670: 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
e680: 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
e690: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
e6a0: 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
e6b0: 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
e6c0: 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
e6d0: 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
e6e0: 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
e6f0: 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
e700: 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
e710: 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
e720: 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
e730: 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
e740: 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
e750: 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
e760: 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
e770: 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
e780: 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
e790: 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
e7a0: 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
e7b0: 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
e7c0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
e7d0: 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
e7e0: 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
e7f0: 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
e800: 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
e810: 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
e820: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
e830: 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
e840: 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
e850: 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
e860: 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
e870: 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
e880: 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
e890: 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
e8a0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
e8b0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
e8c0: 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
e8d0: 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
e8e0: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
e8f0: 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
e900: 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
e910: 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
e920: 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
e930: 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
e940: 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
e950: 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
e960: 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
e970: 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
e980: 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
e990: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
e9a0: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
e9b0: 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
e9c0: 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
e9d0: 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
e9e0: 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
e9f0: 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
ea00: 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
ea10: 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
ea20: 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
ea30: 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
ea40: 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
ea50: 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
ea60: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
ea70: 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
ea80: 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
ea90: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
eaa0: 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
eab0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
eac0: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
ead0: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
eae0: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
eaf0: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
eb00: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
eb10: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
eb20: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
eb30: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
eb40: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
eb50: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
eb60: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
eb70: 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
eb80: 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
eb90: 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
eba0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
ebb0: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
ebc0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
ebd0: 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
ebe0: 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
ebf0: 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
ec00: 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
ec10: 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
ec20: 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
ec30: 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
ec40: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
ec50: 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
ec60: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
ec70: 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
ec80: 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
ec90: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
eca0: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
ecb0: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
ecc0: 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
ecd0: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
ece0: 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
ecf0: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
ed00: 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
ed10: 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
ed20: 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
ed30: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
ed40: 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
ed50: 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
ed60: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
ed70: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
ed80: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
ed90: 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
eda0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
edb0: 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
edc0: 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
edd0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
ede0: 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
edf0: 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
ee00: 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
ee10: 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  uf[]..*/ .int sq
ee20: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
ee30: 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
ee40: 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
ee50: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
ee60: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
ee70: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
ee80: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
ee90: 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
eea0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f  .  int len;..  /
eeb0: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
eec0: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
eed0: 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
eee0: 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
eef0: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
ef00: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
ef10: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
ef20: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
ef30: 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
ef40: 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
ef50: 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
ef60: 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
ef70: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
ef80: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
ef90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
efa0: 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
efb0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
efc0: 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
efd0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
efe0: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
eff0: 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75  assert( len<=nBu
f000: 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
f010: 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
f020: 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  [i] = (u8)(v&0xF
f030: 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
f040: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
f050: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
f060: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
f070: 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
f080: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
f090: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
f0a0: 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
f0b0: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
f0c0: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73              == s
f0e0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f0f0: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
f100: 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
f110: 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
f120: 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
f130: 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
f140: 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
f150: 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
f160: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
f170: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
f180: 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  en += pMem->u.nZ
f190: 65 72 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  ero;.      if( l
f1a0: 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  en>nBuf ){.     
f1b0: 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20     len = nBuf;. 
f1c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
f1d0: 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e  set(&buf[pMem->n
f1e0: 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e  ], 0, len-pMem->
f1f0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  n);.    }.    re
f200: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
f210: 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
f220: 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
f230: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f240: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
f250: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
f260: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
f270: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
f280: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
f290: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
f2a0: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
f2b0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
f2c0: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
f2d0: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
f2e0: 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
f2f0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f300: 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
f310: 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
f320: 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
f330: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f350: 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
f360: 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
f370: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f390: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
f3a0: 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
f3b0: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
f3c0: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
f3d0: 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
f3e0: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
f3f0: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
f400: 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
f410: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
f420: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
f430: 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
f440: 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
f450: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
f460: 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
f470: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
f480: 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
f490: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f4a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f4b0: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  = (signed char)b
f4c0: 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[0];.      pMe
f4d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f4e0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f4f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
f500: 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
f510: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f520: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
f530: 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
f540: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
f550: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
f560: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f570: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
f580: 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
f590: 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
f5a0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
f5b0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
f5c0: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
f5d0: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
f5e0: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<16) | (buf[1]<
f5f0: 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20  <8) | buf[2];.  
f600: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f610: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
f620: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
f630: 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
f640: 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
f650: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
f660: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75   pMem->u.i = (bu
f670: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
f680: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
f690: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
f6a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
f6b0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
f6c0: 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
f6d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
f6e0: 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
f6f0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
f700: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73      u64 x = (((s
f710: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
f720: 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
f730: 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28  .      u32 y = (
f740: 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[2]<<24) | (b
f750: 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[3]<<16) | (bu
f760: 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35  f[4]<<8) | buf[5
f770: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
f780: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
f790: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
f7a0: 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65  4*)&x;.      pMe
f7b0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f7c0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f7d0: 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
f7e0: 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
f7f0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f800: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
f810: 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
f820: 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
f830: 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75    u64 x;.      u
f840: 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e  32 y;.#if !defin
f850: 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
f860: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f870: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
f880: 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69  T).      /* Veri
f890: 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
f8a0: 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
f8b0: 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
f8c0: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he same.      **
f8d0: 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
f8e0: 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
f8f0: 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
f900: 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
f910: 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
f920: 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
f930: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
f940: 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
f950: 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  .      ** endian
f960: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f970: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
f980: 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
f990: 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
f9a0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f9b0: 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
f9c0: 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d  ;.      u64 t2 =
f9d0: 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d   t1;.      swapM
f9e0: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
f9f0: 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t2);.      asser
fa00: 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
fa10: 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
fa20: 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
fa30: 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
fa40: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20  #endif..      x 
fa50: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
fa60: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
fa70: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
fa80: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20  f[3];.      y = 
fa90: 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28  (buf[4]<<24) | (
faa0: 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[5]<<16) | (b
fab0: 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[6]<<8) | buf[
fac0: 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  7];.      x = (x
fad0: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
fae0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
faf0: 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==6 ){.        p
fb00: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
fb10: 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
fb20: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
fb30: 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Int;.      }else
fb40: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
fb50: 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
fb60: 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  & sizeof(pMem->r
fb70: 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
fb80: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
fb90: 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20  loat(x);.       
fba0: 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72   memcpy(&pMem->r
fbb0: 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
fbc0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
fbd0: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
fbe0: 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20  sNaN(pMem->r) ? 
fbf0: 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
fc00: 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eal;.      }.   
fc10: 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20     return 8;.   
fc20: 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
fc30: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
fc40: 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
fc50: 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
fc60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
fc70: 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
fc80: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
fc90: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
fca0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
fcb0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
fcc0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  : {.      int le
fcd0: 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
fce0: 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
fcf0: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
fd00: 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
fd10: 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  >n = len;.      
fd20: 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pMem->xDel = 0;.
fd30: 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
fd40: 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20  _type&0x01 ){.  
fd50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
fd60: 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45  s = MEM_Str | ME
fd70: 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
fd80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
fd90: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
fda0: 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  Blob | MEM_Ephem
fdb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fdc0: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20  return len;.    
fdd0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
fde0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ;.}.../*.** Give
fdf0: 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
fe00: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
fe10: 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
fe20: 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63  parse the.** rec
fe30: 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63  ord into a Unpac
fe40: 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
fe50: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ure.  Return a p
fe60: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
fe70: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  t structure..**.
fe80: 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
fe90: 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72  unction might pr
fea0: 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62 79  ovide szSpace by
feb0: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  tes of memory.**
fec0: 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63 65   space at pSpace
fed0: 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63 61  .  This space ca
fee0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c  n be used to hol
fef0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  d the returned.*
ff00: 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63 6f  * VDbeParsedReco
ff10: 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66 20  rd structure if 
ff20: 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
ff30: 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a  gh.  If it is.**
ff40: 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c   not big enough,
ff50: 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e   space is obtain
ff60: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
ff70: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  malloc()..**.** 
ff80: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
ff90: 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65  ucture should be
ffa0: 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c   closed by a cal
ffb0: 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56  l to.** sqlite3V
ffc0: 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
ffd0: 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55  dRecord()..*/ .U
ffe0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
fff0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
10000 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
10010 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
10020 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
10030 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
10040 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
10050 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
10060 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10070 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
10080 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
10090 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
100a0 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
100b0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
100c0 65 63 6f 72 64 20 2a 70 53 70 61 63 65 2c 2f 2a  ecord *pSpace,/*
100d0 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
100e0 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74 69   to hold resulti
100f0 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ng object */.  i
10100 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20  nt szSpace      
10110 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10120 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
10130 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
10140 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10150 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
10160 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
10170 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
10180 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cord *p;.  int n
10190 42 79 74 65 2c 20 64 3b 0a 20 20 75 33 32 20 69  Byte, d;.  u32 i
101a0 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20  dx;.  u16 u;    
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
101c0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
101d0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
101e0 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
101f0 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  m;.  .  assert( 
10200 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73 69 7a 65  sizeof(Mem)>size
10210 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e 42 79 74  of(*p) );.  nByt
10220 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  e = sizeof(Mem)*
10230 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
10240 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+2);.  if( nByt
10250 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20  e>szSpace ){.   
10260 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
10270 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
10280 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
10290 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
102a0 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c  urn 0;.    p->fl
102b0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
102c0 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43  EED_FREE | UNPAC
102d0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
102e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
102f0 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 70   = pSpace;.    p
10300 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
10310 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
10320 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  .  }.  p->pKeyIn
10330 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
10340 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
10350 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
10360 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 70  1;.  p->aMem = p
10370 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29 70 29  Mem = &((Mem*)p)
10380 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  [1];.  idx = get
10390 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
103a0 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
103b0 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
103c0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
103d0 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 29  && u<p->nField )
103e0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
103f0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
10400 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
10410 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
10420 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  l_type);.    if(
10430 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c 69   d>=nKey && sqli
10440 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
10450 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
10460 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )>0 ) break;.   
10470 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
10480 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
10490 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
104a0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65  nfo->db;.    pMe
104b0 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m->flags = 0;.  
104c0 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20    pMem->zMalloc 
104d0 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
104e0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
104f0 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
10500 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
10510 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
10520 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65   u++;.  }.  asse
10530 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
10540 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
10550 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
10560 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
10570 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
10580 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79   routine destroy
10590 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  s a UnpackedReco
105a0 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  rd object.*/.voi
105b0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
105c0 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
105d0 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  d(UnpackedRecord
105e0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
105f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
10600 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
10610 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20 20 20  D_DESTROY ){.   
10620 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
10630 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  Mem *pMem;.     
10640 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70   for(i=0, pMem=p
10650 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69  ->aMem; i<p->nFi
10660 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b  eld; i++, pMem++
10670 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10680 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  Mem->zMalloc ){.
10690 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
106a0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
106b0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  pMem);.        }
106c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
106d0 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
106e0 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
106f0 46 52 45 45 20 29 7b 0a 20 20 20 20 20 20 73 71  FREE ){.      sq
10700 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
10710 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
10720 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10730 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10740 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
10750 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
10760 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
10770 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
10780 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
10790 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
107a0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
107b0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
107c0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
107d0 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
107e0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
107f0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
10800 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
10810 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
10820 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
10830 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
10840 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
10850 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
10860 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
10870 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
10880 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
10890 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
108a0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
108b0 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
108c0 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
108d0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
108e0 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
108f0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
10900 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
10910 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
10920 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
10930 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
10940 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
10950 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
10960 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
10970 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
10980 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
10990 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
109a0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
109b0 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
109c0 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
109d0 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
109e0 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
109f0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
10a00 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
10a10 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
10a20 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
10a30 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
10a40 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
10a50 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
10a60 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
10a70 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
10a80 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47   the UNPACKED_IG
10a90 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20  NORE_ROWID flag 
10aa0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
10ab0 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a   last byte of.**
10ac0 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70   the header of p
10ad0 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e  Key1 is ignored.
10ae0 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
10af0 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a  that pKey1 is.**
10b00 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61   an index key, a
10b10 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74  nd thus ends wit
10b20 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  h a rowid value.
10b30 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a    The last byte.
10b40 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ** of the header
10b50 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
10b60 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  be the serial ty
10b70 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a  pe of the rowid:
10b80 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c  .** one of 1, 2,
10b90 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20   3, 4, 5, 6, 8, 
10ba0 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67  or 9 - the integ
10bb0 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  er serial types.
10bc0 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74  .** The serial t
10bd0 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c  ype of the final
10be0 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61   rowid will alwa
10bf0 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62  ys be a single b
10c00 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72  yte..** By ignor
10c10 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79  ing this last by
10c20 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
10c30 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63  , we force the c
10c40 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20  omparison.** to 
10c50 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64  ignore the rowid
10c60 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b   at the end of k
10c70 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ey1..*/.int sqli
10c80 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
10c90 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
10ca0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
10cb0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
10cc0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
10cd0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
10ce0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
10cf0 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
10d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10d10 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
10d20 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
10d30 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
10d40 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
10d50 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
10d60 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
10d70 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
10d80 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
10d90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10da0 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
10db0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
10dc0 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
10dd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10de0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10df0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
10e00 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10e10 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
10e20 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
10e30 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
10e40 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
10e50 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
10e60 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
10e70 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
10e80 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
10e90 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d  ;.  mem1.flags =
10ea0 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c 6c   0;.  mem1.zMall
10eb0 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64 78  oc = 0;.  .  idx
10ec0 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
10ed0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
10ee0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
10ef0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
10f00 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47  gs & UNPACKED_IG
10f10 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NORE_ROWID ){.  
10f20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a    szHdr1--;.  }.
10f30 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
10f40 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77  nfo->nField;.  w
10f50 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
10f60 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
10f70 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32  Field ){.    u32
10f80 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
10f90 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
10fa0 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
10fb0 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
10fc0 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
10fd0 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
10fe0 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
10ff0 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
11000 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe1 );.    if( d
11010 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69  1>=nKey1 && sqli
11020 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
11030 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
11040 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  1)>0 ) break;.. 
11050 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
11060 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
11070 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
11080 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
11090 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
110a0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
110b0 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
110c0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
110d0 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
110e0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
110f0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
11100 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
11110 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  m[i],.          
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79   i<nField ? pKey
11140 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a  Info->aColl[i] :
11150 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
11160 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
11170 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  k;.    }.    i++
11180 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 31  ;.  }.  if( mem1
11190 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  .zMalloc ) sqlit
111a0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
111b0 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 69 66 28 20  (&mem1);..  if( 
111c0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rc==0 ){.    /* 
111d0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
111e0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
111f0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
11200 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 20 20   fields and.    
11210 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
11220 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
11230 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
11240 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
11250 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20 66 6c  NCRKEY.    ** fl
11260 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
11270 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
11280 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
11290 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20 2a 2a  s larger..    **
112a0 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f   If the UPACKED_
112b0 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61  PREFIX_MATCH fla
112c0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b  g is set, then k
112d0 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20  eys with common 
112e0 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a 2a 20  prefixes.    ** 
112f0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
11300 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68  o be equal.  Oth
11310 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67  erwise, the long
11320 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20  er key is the . 
11330 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41     ** larger.  A
11340 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
11350 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
11360 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
11370 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  er.    ** if the
11380 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  re is a differen
11390 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
113a0 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
113b0 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52   & UNPACKED_INCR
113c0 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  KEY ){.      rc 
113d0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
113e0 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
113f0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
11400 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  FIX_MATCH ){.   
11410 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d     /* Leave rc==
11420 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  0 */.    }else i
11430 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29  f( idx1<szHdr1 )
11440 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
11450 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
11460 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
11470 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79  tOrder && i<pKey
11480 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20  Info->nField.   
11490 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
114a0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
114b0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63  der[i] ){.    rc
114c0 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   = -rc;.  }..  r
114d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f  eturn rc;.}. ../
114e0 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
114f0 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
11500 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
11510 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
11520 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
11530 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
11540 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
11550 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
11560 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
11570 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
11580 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
11590 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
115a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
115b0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
115c0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
115d0 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
115e0 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
115f0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
11600 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
11610 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
11620 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
11630 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
11640 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
11650 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
11660 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
11670 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
11680 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
11690 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
116a0 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74 65   m, v;..  sqlite
116b0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
116c0 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
116d0 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d    if( nCellKey<=
116e0 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
116f0 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  7fffffff ){.    
11700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11710 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
11720 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20    m.flags = 0;. 
11730 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a   m.db = 0;.  m.z
11740 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63  Malloc = 0;.  rc
11750 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
11760 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
11770 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
11780 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
11790 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
117a0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 28 76 6f 69  n rc;.  }.  (voi
117b0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
117c0 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
117d0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
117e0 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
117f0 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
11800 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d  d);.  lenRowid =
11810 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11820 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
11830 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
11840 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
11850 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
11860 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
11870 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
11880 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
11890 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
118a0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
118b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
118c0 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
118d0 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
118e0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
118f0 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20   pC is point to 
11900 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
11910 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65  ey string in pKe
11920 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65  y (of length nKe
11930 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  y).  Write into 
11940 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
11950 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
11960 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
11970 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
11980 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
11990 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
119a0 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65  r than pKey.  Re
119b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
119c0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
119d0 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20   pKey is either 
119e0 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
119f0 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
11a00 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
11a10 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
11a20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
11a30 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
11a40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
11a50 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
11a60 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
11a70 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
11a80 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
11a90 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
11aa0 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
11ab0 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
11ac0 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
11ad0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
11ae0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
11af0 6d 61 79 20 62 65 20 61 6e 20 75 6e 70 61 63 6b  may be an unpack
11b00 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b  ed version of pK
11b10 65 79 2c 6e 4b 65 79 2e 20 20 49 66 20 70 55 6e  ey,nKey.  If pUn
11b20 70 61 63 6b 65 64 20 69 73 0a 2a 2a 20 73 75 70  packed is.** sup
11b30 70 6c 69 65 64 20 69 74 20 69 73 20 75 73 65 64  plied it is used
11b40 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 70 4b 65   in place of pKe
11b50 79 2c 6e 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  y,nKey..*/.int s
11b60 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
11b70 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43  Compare(.  VdbeC
11b80 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
11b90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
11ba0 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
11bb0 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70  against */.  Unp
11bc0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e  ackedRecord *pUn
11bd0 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61  packed,  /* Unpa
11be0 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
11bf0 70 4b 65 79 20 61 6e 64 20 6e 4b 65 79 20 2a 2f  pKey and nKey */
11c00 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11c20 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
11c30 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
11c40 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
11c50 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
11c60 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
11c70 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
11c80 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
11c90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
11ca0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
11cb0 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e  ellKey);.  if( n
11cc0 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
11cd0 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
11ce0 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
11cf0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
11d00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d  LITE_OK;.  }.  m
11d10 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61  .db = 0;.  m.fla
11d20 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c  gs = 0;.  m.zMal
11d30 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  loc = 0;.  rc = 
11d40 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
11d50 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
11d60 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  sor, 0, (int)nCe
11d70 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
11d80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
11d90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
11da0 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65  assert( pUnpacke
11db0 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  d->flags & UNPAC
11dc0 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
11dd0 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c   );.  *res = sql
11de0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
11df0 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
11e00 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
11e10 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
11e20 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
11e30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11e40 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11e50 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
11e60 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
11e70 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
11e80 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
11e90 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
11ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
11eb0 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
11ec0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
11ed0 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
11ee0 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
11ef0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
11f00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11f10 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
11f20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
11f30 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
11f40 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
11f50 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
11f60 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
11f70 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
11f80 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
11f90 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
11fa0 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
11fb0 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
11fc0 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
11fd0 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
11fe0 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
11ff0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
12000 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
12010 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
12020 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
12030 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12040 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
12050 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
12060 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
12070 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
12080 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
12090 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
120a0 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
120b0 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
120c0 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
120d0 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
120e0 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
120f0 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
12100 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
12110 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
12120 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
12130 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
12140 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
12150 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
12160 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
12170 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
12180 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
12190 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
121a0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
121b0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
121c0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
121d0 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
121e0 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
121f0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
12200 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
12210 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
12220 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
12230 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
12240 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
12250 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
12260 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
12270 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
12280 3b 0a 7d 0a                                      ;.}.