/ Hex Artifact Content
Login

Artifact 34b9478ea0c8b41a6dbce6b1bb1c392c87bb0264:


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 33 38 37 20 32  eaux.c,v 1.387 2
02c0: 30 30 38 2f 30 36 2f 31 35 20 30 32 3a 35 31 3a  008/06/15 02:51:
02d0: 34 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  48 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 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
0930: 61 73 74 20 4e 0a 2a 2a 20 65 6c 65 6d 65 6e 74  ast N.** element
0940: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  s..**.** If an o
0950: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
0960: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
0970: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0980: 61 79 2c 0a 2a 2a 20 56 64 62 65 2e 61 4f 70 20  ay,.** Vdbe.aOp 
0990: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f  and Vdbe.nOpAllo
09a0: 63 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  c remain unchang
09b0: 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74  ed (this is so t
09c0: 68 61 74 0a 2a 2a 20 61 6e 79 20 6f 70 63 6f 64  hat.** any opcod
09d0: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
09e0: 61 74 65 64 20 63 61 6e 20 62 65 20 63 6f 72 72  ated can be corr
09f0: 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65  ectly deallocate
0a00: 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
0a10: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
0a20: 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  Vdbe)..*/.static
0a30: 20 76 6f 69 64 20 72 65 73 69 7a 65 4f 70 41 72   void resizeOpAr
0a40: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
0a50: 20 4e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70   N){.  VdbeOp *p
0a60: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
0a70: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0a80: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 4e 2a  ->db, p->aOp, N*
0a90: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69  sizeof(Op));.  i
0aa0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
0ab0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 4e 3b 0a  ->nOpAlloc = N;.
0ac0: 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65      p->aOp = pNe
0ad0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
0ae0: 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75  Add a new instru
0af0: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73  ction to the lis
0b00: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  t of instruction
0b10: 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65  s current in the
0b20: 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72  .** VDBE.  Retur
0b30: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
0b40: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
0b50: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  tion..**.** Para
0b60: 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  meters:.**.**   
0b70: 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20   p              
0b80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
0b90: 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70  VDBE.**.**    op
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
0bb0: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69  e opcode for thi
0bc0: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
0bd0: 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70  .**    p1, p2, p
0be0: 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a  3      Operands.
0bf0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
0c00: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
0c10: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
0c20: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
0c30: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
0c40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0c50: 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  4() function to 
0c60: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
0c70: 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70   of the P4.** op
0c80: 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erand..*/.int sq
0c90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
0ca0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0cb0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c   int p1, int p2,
0cc0: 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20   int p3){.  int 
0cd0: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  i;.  VdbeOp *pOp
0ce0: 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b  ;..  i = p->nOp;
0cf0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
0d00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
0d10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
0d20: 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a  >nOpAlloc<=i ){.
0d30: 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61      resizeOpArra
0d40: 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  y(p, p->nOpAlloc
0d50: 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   ? p->nOpAlloc*2
0d60: 20 3a 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f   : 1024/sizeof(O
0d70: 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p));.    if( p->
0d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0d90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0da0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
0db0: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
0dc0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
0dd0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 6f 70  pOp->opcode = op
0de0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0df0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0e00: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0e10: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0e20: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0e30: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0e40: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0e50: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0e60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0e70: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0e80: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0ea0: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0eb0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0ec0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0ed0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0ee0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0ef0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0f00: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
0f10: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
0f20: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0f30: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
0f40: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
0f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0f60: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
0f70: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
0f80: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
0f90: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
0fa0: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
0fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
0fc0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
0fd0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
0fe0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
0ff0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1000: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1020: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1030: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1040: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1050: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1060: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1070: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1080: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1090: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10b0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
10c0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
10d0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
10e0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
10f0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1110: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1120: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1140: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1150: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1160: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1170: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1180: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1190: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
11a0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
11c0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
11d0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
11e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11f0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1200: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1210: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1220: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1230: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1250: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
1260: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
1270: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
1280: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
1290: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
12a0: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
12b0: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
12c0: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
12d0: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
12e0: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
12f0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
1300: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
1310: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
1320: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
1330: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
1340: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
1350: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
1360: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
1370: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
1380: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
1390: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
13a0: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
13b0: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
13c0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
13d0: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
13e0: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
13f0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
1400: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
1410: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
1420: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
1430: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
1440: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
1450: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
1460: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1470: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
1480: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
1490: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
14a0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
14b0: 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  c() fails..*/.in
14c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
14d0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b  eLabel(Vdbe *p){
14e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
14f0: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
1500: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1510: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1520: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
1530: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20  nLabelAlloc ){. 
1540: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
1550: 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  c = p->nLabelAll
1560: 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 70  oc*2 + 10;.    p
1570: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
1580: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1590: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
15a0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 4c 61 62 65          p->nLabe
15d0: 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 2d  lAlloc*sizeof(p-
15e0: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
15f0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
1600: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1610: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
1620: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
1630: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
1640: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
1650: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1660: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1670: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
1680: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
1690: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
16a0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
16b0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
16c0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
16d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
16e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16f0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1700: 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78  l(Vdbe *p, int x
1710: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d  ){.  int j = -1-
1720: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
1730: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1740: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1750: 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d  rt( j>=0 && j<p-
1760: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1770: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1780: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
1790: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a   p->nOp;.  }.}..
17a0: 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  /*.** Loop throu
17b0: 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c  gh the program l
17c0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61  ooking for P2 va
17d0: 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65  lues that are ne
17e0: 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d  gative.** on jum
17f0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  p instructions. 
1800: 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65   Each such value
1810: 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65   is a label.  Re
1820: 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62  solve the.** lab
1830: 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  el by setting th
1840: 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74  e P2 value to it
1850: 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65  s correct non-ze
1860: 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ro value..**.** 
1870: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1880: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65  called once afte
1890: 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61  r all opcodes ha
18a0: 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  ve been inserted
18b0: 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65  ..**.** Variable
18c0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69   *pMaxFuncArgs i
18d0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78  s set to the max
18e0: 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e  imum value of an
18f0: 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a  y P2 argument .*
1900: 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74  * to an OP_Funct
1910: 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20  ion, OP_AggStep 
1920: 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70  or OP_VFilter op
1930: 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73  code. This is us
1940: 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65  ed by .** sqlite
1950: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29  3VdbeMakeReady()
1960: 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62   to size the Vdb
1970: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e  e.apArg[] array.
1980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1990: 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 74 68  ine also does th
19a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69  e following opti
19b0: 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20 73 63  mization:  It sc
19c0: 61 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73 74 72  ans for.** instr
19d0: 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  uctions that mig
19e0: 68 74 20 63 61 75 73 65 20 61 20 73 74 61 74 65  ht cause a state
19f0: 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  ment rollback.  
1a00: 53 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  Such instruction
1a10: 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  s.** are:.**.** 
1a20: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74    *  OP_Halt wit
1a30: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
1a40: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
1a50: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
1a60: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
1a70: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
1a80: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
1a90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 63  .**.** If no suc
1aa0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
1ab0: 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65 76 65   found, then eve
1ac0: 72 79 20 53 74 61 74 65 6d 65 6e 74 20 69 6e 73  ry Statement ins
1ad0: 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  truction .** is 
1ae0: 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e 6f 6f  changed to a Noo
1af0: 70 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  p.  In this way,
1b00: 20 77 65 20 61 76 6f 69 64 20 63 72 65 61 74 69   we avoid creati
1b10: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
1b20: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
1b30: 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79 2e  e unnecessarily.
1b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b50: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
1b60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
1b70: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
1b80: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  nt i;.  int nMax
1b90: 41 72 67 73 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  Args = 0;.  Op *
1ba0: 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  pOp;.  int *aLab
1bb0: 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a  el = p->aLabel;.
1bc0: 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74 65 6d    int doesStatem
1bd0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  entRollback = 0;
1be0: 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74 65 6d  .  int hasStatem
1bf0: 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20  entBegin = 0;.  
1c00: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
1c10: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
1c20: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
1c30: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
1c40: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
1c50: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1c60: 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  Function ){.    
1c70: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d    if( pOp->p5>nM
1c80: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
1c90: 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20  s = pOp->p5;.   
1ca0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1cb0: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 0a 23  e==OP_AggStep .#
1cc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cd0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1ce0: 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64          || opcod
1cf0: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 0a 23 65  e==OP_VUpdate.#e
1d00: 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
1d10: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
1d20: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
1d30: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
1d40: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64   }.    if( opcod
1d50: 65 3d 3d 4f 50 5f 48 61 6c 74 20 29 7b 0a 20 20  e==OP_Halt ){.  
1d60: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d      if( pOp->p1=
1d70: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
1d80: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
1d90: 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
1da0: 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74     doesStatement
1db0: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1dc0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1dd0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  if( opcode==OP_S
1de0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
1df0: 20 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65    hasStatementBe
1e00: 67 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  gin = 1;.    }el
1e10: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
1e20: 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  P_Destroy ){.   
1e30: 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74     doesStatement
1e40: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 23 69  Rollback = 1;.#i
1e50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e60: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1e70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1e80: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
1e90: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
1ea0: 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 64  ename ){.      d
1eb0: 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c  oesStatementRoll
1ec0: 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 7d 65  back = 1;.    }e
1ed0: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1ee0: 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20  OP_VFilter ){.  
1ef0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
1f00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20   assert( p->nOp 
1f10: 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20  - i >= 3 );.    
1f20: 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
1f30: 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74  ].opcode==OP_Int
1f40: 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20  eger );.      n 
1f50: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
1f60: 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72      if( n>nMaxAr
1f70: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
1f80: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  n;.#endif.    }.
1f90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1fa0: 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f  VdbeOpcodeHasPro
1fb0: 70 65 72 74 79 28 6f 70 63 6f 64 65 2c 20 4f 50  perty(opcode, OP
1fc0: 46 4c 47 5f 4a 55 4d 50 29 20 26 26 20 70 4f 70  FLG_JUMP) && pOp
1fd0: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
1fe0: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
1ff0: 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  p2<p->nLabel );.
2000: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
2010: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
2020: 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2];.    }.  }.  
2030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
2040: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c  aLabel);.  p->aL
2050: 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d  abel = 0;..  *pM
2060: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
2070: 78 41 72 67 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  xArgs;..  /* If 
2080: 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61 63  we never rollbac
2090: 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  k a statement tr
20a0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
20b0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
20c0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
20d0: 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 6f 20  not needed.  So 
20e0: 63 68 61 6e 67 65 20 65 76 65 72 79 20 4f 50 5f  change every OP_
20f0: 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f  Statement.  ** o
2100: 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f 50  pcode into an OP
2110: 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20 61 76 6f  _Noop.  This avo
2120: 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  id a call to sql
2130: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
2140: 69 76 65 28 29 0a 20 20 2a 2a 20 77 68 69 63 68  ive().  ** which
2150: 20 63 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76   can be expensiv
2160: 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66 6f  e on some platfo
2170: 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rms..  */.  if( 
2180: 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69  hasStatementBegi
2190: 6e 20 26 26 20 21 64 6f 65 73 53 74 61 74 65 6d  n && !doesStatem
21a0: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  entRollback ){. 
21b0: 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f     for(pOp=p->aO
21c0: 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69  p, i=p->nOp-1; i
21d0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29  >=0; i--, pOp++)
21e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
21f0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74  >opcode==OP_Stat
2200: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ement ){.       
2210: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2220: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  P_Noop;.      }.
2230: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2240: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
2250: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
2260: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
2270: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
2280: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2290: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
22a0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
22b0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
22c0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
22d0: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
22e0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
22f0: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
2300: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
2310: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
2320: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64  eturn the.** add
2330: 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73  ress of the firs
2340: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65  t operation adde
2350: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2360: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56  3VdbeAddOpList(V
2370: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c  dbe *p, int nOp,
2380: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
2390: 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61  t *aOp){.  int a
23a0: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
23b0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
23c0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
23d0: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
23e0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b 0a   p->nOpAlloc ){.
23f0: 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61      resizeOpArra
2400: 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  y(p, p->nOpAlloc
2410: 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32   ? p->nOpAlloc*2
2420: 20 3a 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f   : 1024/sizeof(O
2430: 70 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p));.    assert(
2440: 20 70 2d 3e 6e 4f 70 2b 6e 4f 70 3c 3d 70 2d 3e   p->nOp+nOp<=p->
2450: 6e 4f 70 41 6c 6c 6f 63 20 7c 7c 20 70 2d 3e 64  nOpAlloc || p->d
2460: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2470: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2480: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
24a0: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70  ;.  }.  addr = p
24b0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70  ->nOp;.  if( nOp
24c0: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  >0 ){.    int i;
24d0: 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20  .    VdbeOpList 
24e0: 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70  const *pIn = aOp
24f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2500: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b  <nOp; i++, pIn++
2510: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  ){.      int p2 
2520: 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20  = pIn->p2;.     
2530: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20   VdbeOp *pOut = 
2540: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b  &p->aOp[i+addr];
2550: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  .      pOut->opc
2560: 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64  ode = pIn->opcod
2570: 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  e;.      pOut->p
2580: 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20  1 = pIn->p1;.   
2590: 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 20 73     if( p2<0 && s
25a0: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
25b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 75 74  HasProperty(pOut
25c0: 2d 3e 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f  ->opcode, OPFLG_
25d0: 4a 55 4d 50 29 20 29 7b 0a 20 20 20 20 20 20 20  JUMP) ){.       
25e0: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72   pOut->p2 = addr
25f0: 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20   + ADDR(p2);.   
2600: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2610: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b    pOut->p2 = p2;
2620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2630: 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70  Out->p3 = pIn->p
2640: 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  3;.      pOut->p
2650: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
2660: 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  ED;.      pOut->
2670: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  p4.p = 0;.      
2680: 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69  pOut->p5 = 0;.#i
2690: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
26a0: 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43  G.      pOut->zC
26b0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  omment = 0;.    
26c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
26d0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
26e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
26f0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61  bePrintOp(0, i+a
2700: 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ddr, &p->aOp[i+a
2710: 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ddr]);.      }.#
2720: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2730: 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20  p->nOp += nOp;. 
2740: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
2750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
2760: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2770: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f  he P1 operand fo
2780: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
2790: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
27a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
27b0: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
27c0: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
27d0: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
27e0: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
27f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2800: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
2810: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
2820: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
2830: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
2840: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2850: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
2860: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
2870: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
2880: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
2890: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
28a0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
28b0: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
28c0: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
28d0: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
28e0: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
28f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2900: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2910: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
2920: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2930: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
2940: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2950: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
2960: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
2970: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
2980: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2990: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
29a0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
29b0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
29c0: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
29d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
29e0: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
29f0: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
2a00: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
2a10: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
2a20: 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p2 = val;.  }.}.
2a30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2a40: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2a50: 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  3 operand for a 
2a60: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2a70: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
2a80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2a90: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  3(Vdbe *p, int a
2aa0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
2ab0: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2ac0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2ad0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2ae0: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2af0: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2b00: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2b10: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33   p->aOp[addr].p3
2b20: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2b30: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2b40: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20  value of the P5 
2b50: 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20  operand for the 
2b60: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a  most recently.**
2b70: 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e   added operation
2b80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2b90: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64  3VdbeChangeP5(Vd
2ba0: 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a  be *p, u8 val){.
2bb0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
2bc0: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
2bd0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2be0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70   if( p && p->aOp
2bf0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c00: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
2c10: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
2c20: 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p5 = val;.  }.}
2c30: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2c40: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
2c50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
2c60: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
2c70: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
2c80: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
2c90: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
2ca0: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
2cb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
2cc0: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
2cd0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c  int addr){.  sql
2ce0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
2cf0: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
2d00: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
2d10: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
2d20: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
2d30: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
2d40: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
2d50: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
2d60: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
2d70: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
2d80: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2d90: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
2da0: 6e 28 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  n(FuncDef *pDef)
2db0: 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26 26 20  {.  if( pDef && 
2dc0: 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
2dd0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
2de0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
2df0: 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a  te3_free(pDef);.
2e00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
2e10: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
2e20: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
2e30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2e40: 50 34 28 69 6e 74 20 70 34 74 79 70 65 2c 20 76  P4(int p4type, v
2e50: 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69 66 28 20  oid *p3){.  if( 
2e60: 70 33 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  p3 ){.    switch
2e70: 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p4type ){.    
2e80: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
2e90: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
2ea0: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
2eb0: 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20  P4_MPRINTF:.    
2ec0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
2ed0: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
2ee0: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
2ef0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
2f00: 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20  HANDOFF: {.     
2f10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f20: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
2f30: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2f40: 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55    case P4_VDBEFU
2f50: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
2f60: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
2f70: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
2f80: 70 33 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p3;.        free
2f90: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
2fa0: 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  n(pVdbeFunc->pFu
2fb0: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nc);.        sql
2fc0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
2fd0: 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c  xData(pVdbeFunc,
2fe0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2ff0: 69 74 65 33 5f 66 72 65 65 28 70 56 64 62 65 46  ite3_free(pVdbeF
3000: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  unc);.        br
3010: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3020: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
3030: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
3040: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3050: 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a 29 70 33  ion((FuncDef*)p3
3060: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3080: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
3090: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
30a0: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
30b0: 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a 20 20 20  _value*)p3);.   
30c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
30e0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e  ../*.** Change N
30f0: 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e   opcodes startin
3100: 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d  g at addr to No-
3110: 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ops..*/.void sql
3120: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
3130: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
3140: 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a  t addr, int N){.
3150: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f    if( p && p->aO
3160: 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  p ){.    VdbeOp 
3170: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
3180: 64 64 72 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  ddr];.    while(
3190: 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 72   N-- ){.      fr
31a0: 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65  eeP4(pOp->p4type
31b0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
31c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
31d0: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
31e0: 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ));.      pOp->o
31f0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
3200: 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20  .      pOp++;.  
3210: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
3220: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3230: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
3240: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3250: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3260: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3270: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
3280: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
3290: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
32a0: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
32b0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
32c0: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
32d0: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
32e0: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
32f0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
3300: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
3310: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
3320: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
3330: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
3340: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
3350: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
3360: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
3370: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3380: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
3390: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
33a0: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
33b0: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
33c0: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
33d0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
33e0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
33f0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
3400: 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP4..**.** If
3410: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69   n==P4_KEYINFO i
3420: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34  t means that zP4
3430: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
3440: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
3450: 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  ture..** A copy 
3460: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b  is made of the K
3470: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3480: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
3490: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
34a0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f  lite3_malloc, to
34b0: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
34c0: 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c  he Vdbe is final
34d0: 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b  ized..** n==P4_K
34e0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
34f0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50  ndicates that zP
3500: 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65  4 points to a Ke
3510: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  yInfo structure.
3520: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ** stored in mem
3530: 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c  ory that the cal
3540: 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64  ler has obtained
3550: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
3560: 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61  lloc. The .** ca
3570: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ller should not 
3580: 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  free the allocat
3590: 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
35a0: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
35b0: 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69  dbe is.** finali
35c0: 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zed..** .** Othe
35d0: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
35e0: 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c  4_STATIC, P4_COL
35f0: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
3600: 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69  ate that zP4 poi
3610: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
3620: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
3630: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
3640: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
3650: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
3660: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
3670: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
3680: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
3690: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
36a0: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
36b0: 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20  hange P4 on the 
36c0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
36d0: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
36e0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
36f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
3700: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3710: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
3720: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P4, int n){.  Op
3730: 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28   *pOp;.  assert(
3740: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
3750: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
3760: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
3770: 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20    if( p->aOp==0 
3780: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
3790: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
37a0: 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59 49 4e 46   (n != P4_KEYINF
37b0: 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50  O) {.      freeP
37c0: 34 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  4(n, (void*)*(ch
37d0: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
37e0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
37f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  }.  assert( addr
3800: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28  <p->nOp );.  if(
3810: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61   addr<0 ){.    a
3820: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
3830: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30  ;.    if( addr<0
3840: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
3850: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
3860: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 70  ddr];.  freeP4(p
3870: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
3880: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
3890: 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e  4.p = 0;.  if( n
38a0: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
38b0: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
38c0: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
38d0: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
38e0: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
38f0: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
3900: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
3910: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
3920: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
3930: 69 20 3d 20 28 69 6e 74 29 7a 50 34 3b 0a 20 20  i = (int)zP4;.  
3940: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3950: 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  n;.  }else if( z
3960: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  P4==0 ){.    pOp
3970: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20  ->p4.p = 0;.    
3980: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3990: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73  _NOTUSED;.  }els
39a0: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49  e if( n==P4_KEYI
39b0: 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  NFO ){.    KeyIn
39c0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
39d0: 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42    int nField, nB
39e0: 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64  yte;..    nField
39f0: 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50   = ((KeyInfo*)zP
3a00: 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20  4)->nField;.    
3a10: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
3a20: 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69  pKeyInfo) + (nFi
3a30: 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b  eld-1)*sizeof(pK
3a40: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
3a50: 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  ) + nField;.    
3a60: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
3a70: 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  e3Malloc( nByte 
3a80: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
3a90: 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
3aa0: 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  fo;.    if( pKey
3ab0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65  Info ){.      me
3ac0: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a  mcpy(pKeyInfo, z
3ad0: 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  P4, nByte);.    
3ae0: 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72    /* In the curr
3af0: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
3b00: 6f 6e 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 20 69  on, P4_KEYINFO i
3b10: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
3b20: 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 4b 65 79   on.      ** Key
3b30: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 73 20  Info structures 
3b40: 74 68 61 74 20 68 61 76 65 20 6e 6f 20 61 53 6f  that have no aSo
3b50: 72 74 4f 72 64 65 72 20 63 6f 6d 70 6f 6e 65 6e  rtOrder componen
3b60: 74 2e 20 20 45 6c 65 6d 65 6e 74 73 0a 20 20 20  t.  Elements.   
3b70: 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 61 53     ** with an aS
3b80: 6f 72 74 4f 72 64 65 72 20 61 6c 77 61 79 73 20  ortOrder always 
3b90: 75 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  use P4_KEYINFO_H
3ba0: 41 4e 44 4f 46 46 2e 20 20 53 6f 20 77 65 20 64  ANDOFF.  So we d
3bb0: 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6e  o not.      ** n
3bc0: 65 65 64 20 74 6f 20 62 6f 74 68 65 72 20 77 69  eed to bother wi
3bd0: 74 68 20 64 75 70 6c 69 63 61 74 69 6e 67 20 74  th duplicating t
3be0: 68 65 20 61 53 6f 72 74 4f 72 64 65 72 2e 20 2a  he aSortOrder. *
3bf0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
3c00: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3c10: 72 64 65 72 3d 3d 30 20 29 3b 0a 23 69 66 20 30  rder==0 );.#if 0
3c20: 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65  .      aSortOrde
3c30: 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  r = pKeyInfo->aS
3c40: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
3c50: 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29  if( aSortOrder )
3c60: 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  {.        pKeyIn
3c70: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
3c80: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
3c90: 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  )&pKeyInfo->aCol
3ca0: 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  l[nField];.     
3cb0: 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e     memcpy(pKeyIn
3cc0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  fo->aSortOrder, 
3cd0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65  aSortOrder, nFie
3ce0: 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ld);.      }.#en
3cf0: 64 69 66 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70  dif.      pOp->p
3d00: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e  4type = P4_KEYIN
3d10: 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  FO;.    }else{. 
3d20: 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c       p->db->mall
3d30: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
3d40: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3d50: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
3d60: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
3d70: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  n==P4_KEYINFO_HA
3d80: 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70  NDOFF ){.    pOp
3d90: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
3da0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
3db0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
3dc0: 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  O;.  }else if( n
3dd0: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
3de0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
3df0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
3e00: 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = n;.  }else{.
3e10: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
3e20: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 34 29 3b 0a   = strlen(zP4);.
3e30: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
3e40: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
3e50: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
3e60: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3e70: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
3e80: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
3e90: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  EBUG./*.** Chang
3ea0: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
3eb0: 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65   the the most re
3ec0: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
3ed0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3ee0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
3ef0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
3f00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
3f10: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
3f20: 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28  st ap;.  assert(
3f30: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
3f40: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
3f50: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
3f60: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
3f70: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
3f80: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
3f90: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
3fa0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72  >nOp ){.    char
3fb0: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b   **pz = &p->aOp[
3fc0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
3fd0: 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  nt;.    va_start
3fe0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
3ff0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
4000: 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20  *pz);.    *pz = 
4010: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
4020: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
4030: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
4040: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
4050: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
4060: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
4070: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
4080: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
4090: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
40a0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
40b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
40c0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
40d0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
40e0: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
40f0: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
4100: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4110: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61   );.  return ((a
4120: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
4130: 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b  ->nOp)?(&p->aOp[
4140: 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69  addr]):0);.}..#i
4150: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4160: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
4170: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
4180: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
4190: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
41a0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
41b0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
41c0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
41d0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
41e0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
41f0: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
4200: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
4210: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
4220: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
4230: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
4240: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
4250: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
4260: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
4270: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
4280: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
4290: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
42a0: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
42b0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
42c0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
42d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
42e0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
42f0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
4300: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
4310: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4320: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4330: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
4340: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4350: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72  );.      i = str
4360: 6c 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  len(zTemp);.    
4370: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
4380: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
4390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
43a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
43b0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
43c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
43d0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
43e0: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
43f0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
4400: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e           if( i+n
4410: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >nTemp-6 ){.    
4420: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
4430: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c  zTemp[i],",...",
4440: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
4450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
4460: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65   }.          zTe
4470: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
4480: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65           if( pKe
4490: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
44a0: 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  r && pKeyInfo->a
44b0: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a  SortOrder[j] ){.
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
44d0: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
44e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
44f0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4500: 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p[i], pColl->zNa
4510: 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  me,n+1);.       
4520: 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     i += n;.     
4530: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34     }else if( i+4
4540: 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  <nTemp-6 ){.    
4550: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
4560: 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29  emp[i],",nil",4)
4570: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
4580: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
4590: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
45a0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
45b0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
45c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
45d0: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
45e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
45f0: 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45    case P4_COLLSE
4600: 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  Q: {.      CollS
4610: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d  eq *pColl = pOp-
4620: 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  >p4.pColl;.     
4630: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4640: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4650: 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22  "collseq(%.20s)"
4660: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
4670: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4680: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
4690: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
46a0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
46b0: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
46c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
46d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
46e0: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
46f0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
4700: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
4710: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4720: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
4730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4740: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4750: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  Temp, "%lld", *p
4760: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
4770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4780: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
4790: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
47a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
47b0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
47c0: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
47d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
47e0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
47f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4800: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4810: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
4820: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  , *pOp->p4.pReal
4830: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4840: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4850: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  4_MEM: {.      M
4860: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e  em *pMem = pOp->
4870: 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61  p4.pMem;.      a
4880: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
4890: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
48a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
48b0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
48c0: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
48d0: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
48e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
48f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4900: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
4910: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4920: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4930: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
4940: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
4950: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4960: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
4970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4980: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4990: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  emp, "%.16g", pM
49a0: 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 0a  em->r);.      }.
49b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
49c0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
49d0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
49e0: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
49f0: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
4a00: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
4a10: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
4a20: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
4a30: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4a40: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
4a50: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
4a60: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
4a70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4a80: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
4a90: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
4aa0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
4ab0: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29      if( zP4==0 )
4ac0: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
4ad0: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
4ae0: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
4af0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4b00: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
4b10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
4b20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4b30: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
4b40: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
4b50: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
4b60: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
4b70: 2e 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ..**.*/.void sql
4b80: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
4b90: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
4ba0: 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20  ){.  int mask;. 
4bb0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
4bc0: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b   i<p->db->nDb );
4bd0: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73 69 7a  .  assert( i<siz
4be0: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
4bf0: 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  )*8 );.  mask = 
4c00: 31 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e  1<<i;.  if( (p->
4c10: 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b  btreeMask & mask
4c20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62  )==0 ){.    p->b
4c30: 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  treeMask |= mask
4c40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
4c50: 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65  eeMutexArrayInse
4c60: 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70  rt(&p->aMutex, p
4c70: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
4c80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64  );.  }.}...#if d
4c90: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
4ca0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
4cb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
4cc0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
4cd0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
4ce0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4cf0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
4d00: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
4d10: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
4d20: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
4d30: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
4d40: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
4d50: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74  r zPtr[50];.  st
4d60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4d70: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
4d80: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
4d90: 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c  4d %-4s %.2X %s\
4da0: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
4db0: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
4dc0: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
4dd0: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
4de0: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20  sizeof(zPtr));. 
4df0: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
4e00: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
4e10: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
4e20: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
4e30: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
4e40: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
4e50: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66  P4, pOp->p5,.#if
4e60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
4e70: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d  .      pOp->zCom
4e80: 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d  ment ? pOp->zCom
4e90: 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a  ment : "".#else.
4ea0: 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a        "".#endif.
4eb0: 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f    );.  fflush(pO
4ec0: 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ut);.}.#endif../
4ed0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
4ee0: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
4ef0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
4f00: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
4f10: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
4f20: 6e 74 20 4e 2c 20 69 6e 74 20 66 72 65 65 62 75  nt N, int freebu
4f30: 66 66 65 72 73 29 7b 0a 20 20 69 66 28 20 70 20  ffers){.  if( p 
4f40: 26 26 20 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  && N ){.    sqli
4f50: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4f60: 0a 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 5f  .    int malloc_
4f70: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
4f80: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 77  locFailed;.    w
4f90: 68 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20  hile( N-->0 ){. 
4fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32       assert( N<2
4fb0: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
4fc0: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 69 66  ].db );.      if
4fd0: 28 20 66 72 65 65 62 75 66 66 65 72 73 20 29 7b  ( freebuffers ){
4fe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4ff0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
5000: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5020: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 45 78 74  dbeMemReleaseExt
5030: 65 72 6e 61 6c 28 70 29 3b 0a 20 20 20 20 20 20  ernal(p);.      
5040: 7d 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  }.      p->flags
5050: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
5060: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     p++;.    }.  
5070: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
5080: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
5090: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65  ed;.  }.}..#ifde
50a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
50b0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
50c0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  T.int sqlite3Vdb
50d0: 65 52 65 6c 65 61 73 65 42 75 66 66 65 72 73 28  eReleaseBuffers(
50e0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
50f0: 69 69 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 20  ii;.  int nFree 
5100: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
5110: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5120: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
5130: 29 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  );.  for(ii=1; i
5140: 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b 2b  i<=p->nMem; ii++
5150: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
5160: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d 3b   = &p->aMem[ii];
5170: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a  .    if( pMem->z
5180: 20 26 26 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26   && pMem->flags&
5190: 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20  MEM_Dyn ){.     
51a0: 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 2d 3e   assert( !pMem->
51b0: 78 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 6e 46  xDel );.      nF
51c0: 72 65 65 20 2b 3d 20 73 71 6c 69 74 65 33 4d 61  ree += sqlite3Ma
51d0: 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 7a  llocSize(pMem->z
51e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
51f0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
5200: 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mem);.    }.  }.
5210: 20 20 72 65 74 75 72 6e 20 6e 46 72 65 65 3b 0a    return nFree;.
5220: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
5230: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
5240: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
5250: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
5260: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
5270: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
5280: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
5290: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
52a0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
52b0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
52c0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
52d0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
52e0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
52f0: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
5300: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
5310: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
5320: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
5330: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
5340: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
5350: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
5360: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
5370: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
5380: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
5390: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
53a0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
53b0: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
53c0: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
53d0: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
53e0: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
53f0: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
5400: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
5410: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
5420: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
5430: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
5460: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
5470: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
5480: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
5490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
54a0: 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73   *pMem = p->pRes
54b0: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
54c0: 6d 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  m[1];..  assert(
54d0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
54e0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
54f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20  DBE_MAGIC_RUN ) 
5500: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5510: 53 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  SUSE;.  assert( 
5520: 64 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54  db->magic==SQLIT
5530: 45 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a  E_MAGIC_BUSY );.
5540: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
5550: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
5560: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
5570: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
5580: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
5590: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
55a0: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
55b0: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
55c0: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
55d0: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
55e0: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
55f0: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
5600: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
5610: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
5620: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
5630: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
5640: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
5650: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e  mArray(pMem, p->
5660: 6e 4d 65 6d 2c 20 31 29 3b 0a 0a 20 20 64 6f 7b  nMem, 1);..  do{
5670: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
5680: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d  ;.  }while( i<p-
5690: 3e 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61  >nOp && p->expla
56a0: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
56b0: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
56c0: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
56d0: 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  >=p->nOp ){.    
56e0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
56f0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
5700: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
5710: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
5720: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
5730: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
5740: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
5750: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5760: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
5770: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
5780: 73 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  sg, sqlite3ErrSt
5790: 72 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a  r(p->rc), (char*
57a0: 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )0);.  }else{.  
57b0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f    char *z;.    O
57c0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
57d0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
57e0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
57f0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5800: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
5810: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5820: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5830: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
5840: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
5870: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  nter */.      pM
5880: 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70  em++;.  .      p
5890: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
58a0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c  _Static|MEM_Str|
58b0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
58c0: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
58d0: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
58e0: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
58f0: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20    /* Opcode */. 
5900: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
5910: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
5920: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65   pMem->n = strle
5930: 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  n(pMem->z);.    
5940: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5950: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
5960: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
5970: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
5980: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a   pMem++;.    }..
5990: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
59a0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
59b0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
59c0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
59e0: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P1 */.    pMem->
59f0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5a00: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
5a10: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
5a20: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
5a30: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
5a40: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
5a70: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5a80: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
5a90: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
5aa0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
5ab0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
5ac0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
5ad0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
5ae0: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20    /* P3 */.     
5b10: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5b20: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5b30: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
5b40: 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
5b50: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
5b60: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20  em, 32, 0) ){   
5b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
5b80: 2f 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  /.      p->db->m
5b90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
5ba0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
5bb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5bc0: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  }.    pMem->flag
5bd0: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
5be0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
5bf0: 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28    z = displayP4(
5c00: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32  pOp, pMem->z, 32
5c10: 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d  );.    if( z!=pM
5c20: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73  em->z ){.      s
5c30: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
5c40: 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c  Str(pMem, z, -1,
5c50: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
5c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5c70: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
5c80: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
5c90: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5ca0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
5cb0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
5cc0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
5cd0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
5ce0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
5cf0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
5d00: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
5d10: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
5d20: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
5d30: 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20  pMem, 4, 0) ){. 
5d40: 20 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61         p->db->ma
5d50: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
5d60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
5d70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5d80: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
5d90: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
5da0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
5db0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
5dc0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
5dd0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
5de0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
5df0: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
5e00: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
5e10: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5e20: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
5e30: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
5e40: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
5e50: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
5e60: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
5e70: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
5e80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  t ){.        pMe
5e90: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
5ea0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
5eb0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70       pMem->z = p
5ec0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  Op->zComment;.  
5ed0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
5ee0: 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b  strlen(pMem->z);
5ef0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
5f00: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
5f10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
5f20: 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
5f30: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
5f40: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f60: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
5f70: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
5f80: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ype = SQLITE_NUL
5f90: 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  L;.      }.    }
5fa0: 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  ..    p->nResCol
5fb0: 75 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e  umn = 8 - 5*(p->
5fc0: 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20  explain-1);.    
5fd0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
5fe0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
5ff0: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
6000: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
6010: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6020: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
6030: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6040: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
6050: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
6060: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
6070: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
6080: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6090: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
60a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
60b0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
60c0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p *pOp;.  if( nO
60d0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
60e0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
60f0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
6100: 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26  ode==OP_Trace &&
6110: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
6120: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6130: 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  *z = pOp->p4.z;.
6140: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
6150: 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b  ce(*(u8*)z) ) z+
6160: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
6170: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
6180: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
6190: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
61a0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
61b0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
61c0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
61d0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
61e0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
61f0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
6200: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
6210: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
6220: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
6230: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
6240: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
6250: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
6260: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
6270: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
6280: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
6290: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
62a0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
62b0: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
62c0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
62d0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
62e0: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
62f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6300: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
6310: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
6320: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73      for(i=0; iss
6330: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
6340: 68 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  har)z[i]); i++){
6350: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
6360: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
6370: 20 69 66 28 20 69 73 73 70 61 63 65 28 28 75 6e   if( isspace((un
6380: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d  signed char)z[i]
6390: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
63a0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
63b0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
63c0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
63d0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
63e0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
63f0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
6400: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
6410: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
6420: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
6430: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
6440: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
6450: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
6460: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
6470: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70   */.../*.** Prep
6480: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
6490: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
64a0: 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ion.  This invol
64b0: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
64c0: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
64d0: 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64   stack space and
64e0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
64f0: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
6500: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
6510: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
6520: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
6530: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
6540: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
6550: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
6560: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
6570: 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  is is the only w
6580: 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42  ay to move a VDB
6590: 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  E from VDBE_MAGI
65a0: 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42  C_INIT to.** VDB
65b0: 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a  E_MAGIC_RUN..*/.
65c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
65d0: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
65e0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6600: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  he VDBE */.  int
6610: 20 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20   nVar,          
6620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6630: 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65  umber of '?' see
6640: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74   in the SQL stat
6650: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
6660: 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Mem,            
6670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6680: 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ber of memory ce
6690: 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  lls to allocate 
66a0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
66b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
66c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
66d0: 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f   cursors to allo
66e0: 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  cate */.  int is
66f0: 45 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20  Explain         
6700: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6710: 20 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20   if the EXPLAIN 
6720: 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73  keywords is pres
6730: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
6740: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
6750: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73   = p->db;..  ass
6760: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
6770: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
6780: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
6790: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
67a0: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
67b0: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
67c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
67d0: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
67e0: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
67f0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
6800: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
6810: 61 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20  an later. This. 
6820: 20 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74    * is because t
6830: 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a  he call to resiz
6840: 65 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77  eOpArray() below
6850: 20 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a   may shrink the.
6860: 20 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72     * p->aOp[] ar
6870: 72 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f  ray to save memo
6880: 72 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65  ry if called whe
6890: 6e 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f  n in VDBE_MAGIC_
68a0: 52 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e  RUN .   * state.
68b0: 0a 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  .   */.  p->magi
68c0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
68d0: 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61  UN;..  /* For ea
68e0: 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72  ch cursor requir
68f0: 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74  ed, also allocat
6900: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  e a memory cell.
6910: 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c   Memory.  ** cel
6920: 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73  ls (nMem+1-nCurs
6930: 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75  or)..nMem, inclu
6940: 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72  sive, will never
6950: 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   be used by.  **
6960: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
6970: 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20  m. Instead they 
6980: 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f  are used to allo
6990: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20  cate space for. 
69a0: 20 2a 2a 20 43 75 72 73 6f 72 2f 42 74 43 75 72   ** Cursor/BtCur
69b0: 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  sor structures. 
69c0: 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  The blob of memo
69d0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
69e0: 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20  th .  ** cursor 
69f0: 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  0 is stored in m
6a00: 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e  emory cell nMem.
6a10: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d   Memory cell (nM
6a20: 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65  em-1).  ** store
6a30: 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  s the blob of me
6a40: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
6a50: 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65  with cursor 1, e
6a60: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65  tc..  **.  ** Se
6a70: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
6a80: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
6a90: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
6aa0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
6ab0: 6f 63 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f  ocation space fo
6ac0: 72 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a  r registers..  *
6ad0: 2f 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d  /.  if( p->aMem=
6ae0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  =0 ){.    int nA
6af0: 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  rg;       /* Max
6b00: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
6b10: 72 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20  rgs passed to a 
6b20: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  user function. *
6b30: 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56  /.    resolveP2V
6b40: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
6b50: 0a 20 20 20 20 2f 2a 72 65 73 69 7a 65 4f 70 41  .    /*resizeOpA
6b60: 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b  rray(p, p->nOp);
6b70: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  */.    assert( n
6b80: 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Var>=0 );.    if
6b90: 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e  ( isExplain && n
6ba0: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20  Mem<10 ){.      
6bb0: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 20 3d  p->nMem = nMem =
6bc0: 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   10;.    }.    p
6bd0: 2d 3e 61 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33  ->aMem = sqlite3
6be0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
6bf0: 0a 20 20 20 20 20 20 20 20 6e 4d 65 6d 2a 73 69  .        nMem*si
6c00: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
6c10: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20          /* aMem 
6c20: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
6c30: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
6c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61            /* aVa
6c50: 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72  r */.      + nAr
6c60: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20  g*sizeof(Mem*)  
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
6c80: 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20  pArg */.      + 
6c90: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72  nVar*sizeof(char
6ca0: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  *)             /
6cb0: 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20  * azVar */.     
6cc0: 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f   + nCursor*sizeo
6cd0: 66 28 43 75 72 73 6f 72 2a 29 20 2b 20 31 20 20  f(Cursor*) + 1  
6ce0: 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20    /* apCsr */.  
6cf0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62    );.    if( !db
6d00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6d10: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d  {.      p->aMem-
6d20: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  -;             /
6d30: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
6d40: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
6d50: 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
6d60: 65 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 20  em;        /*   
6d70: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
6d80: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20  nMem-1 */.      
6d90: 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d  p->aVar = &p->aM
6da0: 65 6d 5b 6e 4d 65 6d 2b 31 5d 3b 0a 20 20 20 20  em[nMem+1];.    
6db0: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72    p->nVar = nVar
6dc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72  ;.      p->okVar
6dd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
6de0: 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70  pArg = (Mem**)&p
6df0: 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20  ->aVar[nVar];.  
6e00: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28      p->azVar = (
6e10: 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67  char**)&p->apArg
6e20: 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d  [nArg];.      p-
6e30: 3e 61 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72  >apCsr = (Cursor
6e40: 2a 2a 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61  **)&p->azVar[nVa
6e50: 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75  r];.      p->nCu
6e60: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
6e70: 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e        for(n=0; n
6e80: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
6e90: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
6ea0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
6eb0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61  ;.        p->aVa
6ec0: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
6ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
6ee0: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
6ef0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
6f00: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
6f10: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  EM_Null;.       
6f20: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
6f30: 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   db;.      }.   
6f40: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
6f50: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
6f60: 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b  (n=1; n<p->nMem;
6f70: 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   n++){.    asser
6f80: 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62  t( p->aMem[n].db
6f90: 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ==db );.  }.#end
6fa0: 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  if..  p->pc = -1
6fb0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
6fc0: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71  TE_OK;.  p->uniq
6fd0: 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ueCnt = 0;.  p->
6fe0: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
6ff0: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70  _Abort;.  p->exp
7000: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
7010: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
7020: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
7030: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
7040: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
7050: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
7060: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
7070: 35 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53  55;.  p->openedS
7080: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69  tatement = 0;.#i
7090: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
70a0: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
70b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
70c0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
70d0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
70e0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
70f0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
7100: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
7110: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
7120: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
7130: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
7140: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
7150: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
7160: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
7170: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7180: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
7190: 62 65 20 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70  be *p, Cursor *p
71a0: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
71b0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
71c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
71d0: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
71e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
71f0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
7200: 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sor);.  }.  if( 
7210: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
7220: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
7230: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d  e(pCx->pBt);.  }
7240: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7250: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
7260: 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74  E.  if( pCx->pVt
7270: 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  abCursor ){.    
7280: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
7290: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
72a0: 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72   = pCx->pVtabCur
72b0: 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  sor;.    const s
72c0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
72d0: 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d  Module = pCx->pM
72e0: 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e  odule;.    p->in
72f0: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a  VtabMethod = 1;.
7300: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
7310: 33 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62  3SafetyOff(p->db
7320: 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  );.    pModule->
7330: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73  xClose(pVtabCurs
7340: 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  or);.    (void)s
7350: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70  qlite3SafetyOn(p
7360: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ->db);.    p->in
7370: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
7380: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
7390: 20 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75   !pCx->ephemPseu
73a0: 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73  doTable ){.    s
73b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d  qlite3_free(pCx-
73c0: 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 2f  >pData);.  }.  /
73d0: 2a 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c  * memset(pCx, 0,
73e0: 20 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 29 29   sizeof(Cursor))
73f0: 3b 20 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65  ; */.  /* sqlite
7400: 33 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70  3_free(pCx->aTyp
7410: 65 29 3b 20 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69  e); */.  /* sqli
7420: 74 65 33 5f 66 72 65 65 28 70 43 78 29 3b 20 2a  te3_free(pCx); *
7430: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  /.}../*.** Close
7440: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63   all cursors exc
7450: 65 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72  ept for VTab cur
7460: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75  sors that are cu
7470: 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73  rrently.** in us
7480: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7490: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
74a0: 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61  sExceptActiveVta
74b0: 62 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  bs(Vdbe *p){.  i
74c0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
74d0: 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCsr==0 ) return
74e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
74f0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
7500: 0a 20 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20  .    Cursor *pC 
7510: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
7520: 20 20 20 69 66 28 20 70 43 20 26 26 20 28 21 70     if( pC && (!p
7530: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c  ->inVtabMethod |
7540: 7c 20 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73  | !pC->pVtabCurs
7550: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  or) ){.      sql
7560: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
7570: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
7580: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
7590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
75a0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
75b0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
75c0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
75d0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
75e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
75f0: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
7600: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
7610: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
7620: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
7630: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
7640: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
7650: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
7660: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
7670: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
7680: 61 6e 75 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  anup(Vdbe *p, in
7690: 74 20 66 72 65 65 62 75 66 66 65 72 73 29 7b 0a  t freebuffers){.
76a0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6c 6f 73 65    int i;.  close
76b0: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
76c0: 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a  ActiveVtabs(p);.
76d0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d    for(i=1; i<=p-
76e0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
76f0: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
7700: 26 70 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 4d 45 4d  &p->aMem[i], MEM
7710: 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  _Null);.  }.  re
7720: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
7730: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
7740: 65 6d 2c 20 66 72 65 65 62 75 66 66 65 72 73 29  em, freebuffers)
7750: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46  ;.  sqlite3VdbeF
7760: 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69  ifoClear(&p->sFi
7770: 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f  fo);.  if( p->co
7780: 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20  ntextStack ){.  
7790: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
77a0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b  contextStackTop;
77b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
77c0: 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61  ite3VdbeFifoClea
77d0: 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  r(&p->contextSta
77e0: 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20  ck[i].sFifo);.  
77f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
7800: 66 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53  free(p->contextS
7810: 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  tack);.  }.  p->
7820: 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30  contextStack = 0
7830: 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ;.  p->contextSt
7840: 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20  ackDepth = 0;.  
7850: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54  p->contextStackT
7860: 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  op = 0;.  sqlite
7870: 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73  3_free(p->zErrMs
7880: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
7890: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
78a0: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
78b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
78c0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
78d0: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
78e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
78f0: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
7900: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
7910: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
7920: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
7930: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
7940: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
7950: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
7960: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
7970: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
7980: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
7990: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
79a0: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
79b0: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
79c0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
79d0: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
79e0: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
79f0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
7a00: 69 6e 74 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73  int n;..  releas
7a10: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
7a20: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
7a30: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 2c 20  lumn*COLNAME_N, 
7a40: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
7a50: 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  ee(p->aColName);
7a60: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
7a70: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
7a80: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e  ->nResColumn = n
7a90: 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e  ResColumn;.  p->
7aa0: 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e  aColName = pColN
7ab0: 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69  ame = (Mem*)sqli
7ac0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7ad0: 70 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  p->db, sizeof(Me
7ae0: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
7af0: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
7b00: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
7b10: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70  n-- > 0 ){.    p
7b20: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d  ColName->flags =
7b30: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
7b40: 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d  ColName->db = p-
7b50: 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  >db;.    pColNam
7b60: 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e++;.  }.}../*.*
7b70: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
7b80: 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
7b90: 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
7ba0: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
7bb0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
7bc0: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
7bd0: 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
7be0: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
7bf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
7c00: 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
7c10: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
7c20: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
7c30: 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e  ls()..**.** If N
7c40: 3d 3d 50 34 5f 53 54 41 54 49 43 20 20 69 74 20  ==P4_STATIC  it 
7c50: 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65  means that zName
7c60: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
7c70: 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74   a constant stat
7c80: 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64  ic.** string and
7c90: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
7ca0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49  y the pointer. I
7cb0: 66 20 69 74 20 69 73 20 50 34 5f 44 59 4e 41 4d  f it is P4_DYNAM
7cc0: 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65  IC, then .** the
7cd0: 20 73 74 72 69 6e 67 20 69 73 20 66 72 65 65 64   string is freed
7ce0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
7cf0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
7d00: 64 62 65 20 69 73 20 66 69 6e 69 73 68 65 64 20  dbe is finished 
7d10: 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65  with.** it. Othe
7d20: 72 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f  rwise, N bytes o
7d30: 66 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69  f zName are copi
7d40: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
7d50: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7d60: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64  (Vdbe *p, int id
7d70: 78 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73  x, int var, cons
7d80: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
7d90: 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b  nt N){.  int rc;
7da0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
7db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
7dc0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b  p->nResColumn );
7dd0: 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43  .  assert( var<C
7de0: 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66  OLNAME_N );.  if
7df0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
7e00: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
7e10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61  QLITE_NOMEM;.  a
7e20: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
7e30: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
7e40: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
7e50: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
7e60: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69  ResColumn]);.  i
7e70: 66 28 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43  f( N==P4_DYNAMIC
7e80: 20 7c 7c 20 4e 3d 3d 50 34 5f 53 54 41 54 49 43   || N==P4_STATIC
7e90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7ea0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
7eb0: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
7ec0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
7ed0: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
7ee0: 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
7ef0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
7f00: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
7f10: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53  ame, zName, N, S
7f20: 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54  QLITE_UTF8,SQLIT
7f30: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
7f40: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
7f50: 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 34 5f 44  TE_OK && N==P4_D
7f60: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43  YNAMIC ){.    pC
7f70: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26 3d  olName->flags &=
7f80: 20 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a   (~MEM_Static);.
7f90: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d      pColName->zM
7fa0: 61 6c 6c 6f 63 20 3d 20 70 43 6f 6c 4e 61 6d 65  alloc = pColName
7fb0: 2d 3e 7a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->z;.  }.  retur
7fc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7fd0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
7fe0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
7ff0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
8000: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
8010: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
8020: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
8030: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
8040: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
8050: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
8060: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
8070: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
8080: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
8090: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
80a0: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
80b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
80c0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
80d0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
80e0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
80f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
8100: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
8110: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
8120: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
8130: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
8140: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
8150: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
8160: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
8170: 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65   0;..  /* Before
8180: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
8190: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
81a0: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
81b0: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
81c0: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
81d0: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
81e0: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
81f0: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
8200: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
8210: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
8220: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
8230: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
8240: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
8250: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
8260: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
8270: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
8280: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
8290: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
82a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
82b0: 62 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20  bSync(db, rc);. 
82c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
82d0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
82e0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
82f0: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
8300: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
8310: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
8320: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
8330: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
8340: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
8350: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
8360: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
8370: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
8380: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
8390: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
83a0: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
83b0: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
83c0: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
83d0: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
83e0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
83f0: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
8400: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
8410: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
8420: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
8430: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
8440: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
8450: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
8460: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
8470: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
8480: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
8490: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
84a0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
84b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
84c0: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
84d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
84e0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
84f0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
8500: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
8510: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
8520: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
8530: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
8540: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
8550: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
8560: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20  SafetyOff(db);. 
8570: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
8580: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
8590: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
85a0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
85b0: 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20  fetyOn(db);.    
85c0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
85d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
85e0: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
85f0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
8600: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
8610: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
8620: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
8630: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
8640: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
8650: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
8660: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
8670: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
8680: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
8690: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
86a0: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
86b0: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
86c0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
86d0: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
86e0: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
86f0: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
8700: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
8710: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
8720: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
8730: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
8740: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
8750: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
8760: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
8770: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
8780: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
8790: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
87a0: 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42  =strlen(sqlite3B
87b0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
87c0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
87d0: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b   || nTrans<=1 ){
87e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
87f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
8800: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
8810: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
8820: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
8830: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
8840: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
8850: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
8860: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
8870: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
8880: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
8890: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
88a0: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
88b0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
88c0: 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
88d0: 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
88e0: 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
88f0: 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
8900: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
8910: 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
8920: 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
8930: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
8940: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
8950: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
8960: 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
8970: 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
8980: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
8990: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
89a0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
89b0: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
89c0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
89d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
89e0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
89f0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8a00: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
8a10: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
8a20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8a30: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
8a40: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
8a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8a60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8a70: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
8a80: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
8a90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
8aa0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
8ab0: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
8ac0: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
8ad0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
8ae0: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
8af0: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
8b00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
8b10: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
8b20: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
8b30: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
8b40: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
8b50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
8b60: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
8b70: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
8b80: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
8b90: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
8ba0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
8bb0: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
8bc0: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
8bd0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8be0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
8bf0: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
8c00: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
8c10: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
8c20: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
8c30: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
8c40: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
8c50: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
8c60: 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a  int res;..    /*
8c70: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
8c80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
8c90: 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20  me */.    do {. 
8ca0: 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b       u32 random;
8cb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8cc0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8cd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
8ce0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61  omness(sizeof(ra
8cf0: 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b  ndom), &random);
8d00: 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  .      zMaster =
8d10: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8d20: 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c  db, "%s-mj%08X",
8d30: 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64   zMainFile, rand
8d40: 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a  om&0x7fffffff);.
8d50: 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
8d60: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  er ){.        re
8d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8d80: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
8d90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
8da0: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
8db0: 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
8dc0: 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
8dd0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
8de0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
8df0: 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
8e00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8e10: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
8e20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
8e30: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
8e40: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
8e50: 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
8e60: 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
8e70: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
8e80: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
8e90: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
8ea0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
8eb0: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
8ec0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
8ed0: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
8ee0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
8ef0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8f00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
8f10: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
8f20: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
8f30: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
8f40: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
8f50: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
8f60: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
8f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
8f80: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
8f90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8fa0: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
8fb0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
8fc0: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
8fd0: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
8fe0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8ff0: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
9000: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
9010: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
9020: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
9030: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
9040: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
9050: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
9060: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
9070: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
9080: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
9090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
90a0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
90b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
90c0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
90d0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
90e0: 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e  f( i==1 ) contin
90f0: 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  ue;   /* Ignore 
9100: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
9110: 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  e */.      if( s
9120: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
9130: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
9140: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
9150: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
9160: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
9170: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
9180: 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
9190: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
91a0: 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79  * Ignore :memory
91b0: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
91c0: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
91d0: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
91e0: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
91f0: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
9200: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
9210: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9230: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
9240: 20 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a   zFile, strlen(z
9250: 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
9260: 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
9270: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65   += strlen(zFile
9280: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
9290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
92a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
92b0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
92c0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
92d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
92e0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
92f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
9300: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
9310: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
9320: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9330: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9340: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
9350: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9360: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
9370: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
9380: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
9390: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
93a0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
93b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61  ..    */.    zMa
93c0: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
93d0: 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
93e0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
93f0: 0a 20 20 20 20 69 66 28 20 28 6e 65 65 64 53 79  .    if( (needSy
9400: 6e 63 20 0a 20 20 20 20 20 26 26 20 28 30 3d 3d  nc .     && (0==
9410: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
9420: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
9430: 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
9440: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
9450: 29 29 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73  )).     && (rc=s
9460: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
9470: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
9480: 43 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49  C_NORMAL))!=SQLI
9490: 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
94a0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
94b0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
94c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
94d0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
94e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
94f0: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
9500: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9510: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
9520: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
9530: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
9540: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
9550: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
9560: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
9570: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9580: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
9590: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
95a0: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
95b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
95c0: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
95d0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
95e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
95f0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
9600: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
9610: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
9620: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
9630: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9640: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
9650: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
9660: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
9670: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
9680: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
9690: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
96a0: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
96b0: 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
96c0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
96d0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
96e0: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
96f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
9700: 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
9710: 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
9720: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
9730: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
9740: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
9750: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
9760: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
9770: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
9780: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
9790: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
97a0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
97b0: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
97c0: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
97d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
97e0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
97f0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
9800: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9810: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9820: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
9830: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9840: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
9850: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9860: 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
9870: 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
9880: 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
9890: 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
98a0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
98b0: 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
98c0: 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
98d0: 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
98e0: 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
98f0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
9900: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9910: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
9920: 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
9930: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
9940: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
9950: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
9960: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
9970: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
9980: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
9990: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
99a0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
99b0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
99c0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
99d0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
99e0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
99f0: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
9a00: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
9a10: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
9a20: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
9a30: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
9a40: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
9a50: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
9a60: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
9a70: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
9a80: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
9a90: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
9aa0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
9ab0: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
9ac0: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
9ad0: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
9ae0: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
9af0: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
9b00: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
9b10: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
9b20: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
9b30: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
9b40: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
9b50: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
9b60: 74 65 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e  te3FaultBeginBen
9b70: 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54  ign(SQLITE_FAULT
9b80: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29  INJECTOR_MALLOC)
9b90: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
9ba0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
9bb0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
9bc0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9bd0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
9be0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
9bf0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9c00: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
9c10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9c20: 73 71 6c 69 74 65 33 46 61 75 6c 74 45 6e 64 42  sqlite3FaultEndB
9c30: 65 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55  enign(SQLITE_FAU
9c40: 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f  LTINJECTOR_MALLO
9c50: 43 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  C);.    enable_s
9c60: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
9c70: 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  rs();..    sqlit
9c80: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
9c90: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
9ca0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9cb0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
9cc0: 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  e checks that th
9cd0: 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65  e sqlite3.active
9ce0: 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61  VdbeCnt count va
9cf0: 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65  riable.** matche
9d00: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9d10: 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69  vdbe's in the li
9d20: 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65  st sqlite3.pVdbe
9d30: 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72   that are.** cur
9d40: 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41  rently active. A
9d50: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c  n assertion fail
9d60: 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75  s if the two cou
9d70: 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
9d80: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  ..** This is an 
9d90: 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68  internal self-ch
9da0: 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73  eck only - it is
9db0: 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61   not an essentia
9dc0: 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20  l processing.** 
9dd0: 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  step..**.** This
9de0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e   is a no-op if N
9df0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
9e00: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
9e10: 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20  BUG.static void 
9e20: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
9e30: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  nt(sqlite3 *db){
9e40: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e  .  Vdbe *p;.  in
9e50: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d  t cnt = 0;.  p =
9e60: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
9e70: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
9e80: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
9e90: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
9ea0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
9eb0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  cnt++;.    }.   
9ec0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
9ed0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
9ee0: 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ==db->activeVdbe
9ef0: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
9f00: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
9f10: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
9f20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65  dif../*.** For e
9f30: 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20  very Btree that 
9f40: 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  in database conn
9f50: 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20  ection db which 
9f60: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  .** has been mod
9f70: 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72  ified, "trip" or
9f80: 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68   invalidate each
9f90: 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68   cursor in.** th
9fa0: 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68  at Btree might h
9fb0: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
9fc0: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75  d so that the cu
9fd0: 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65  rsor.** can neve
9fe0: 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e  r be used again.
9ff0: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77    This happens w
a000: 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  hen a rollback.*
a010: 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68  ** occurs.  We h
a020: 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20  ave to trip all 
a030: 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  the other cursor
a040: 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f  s, even.** curso
a050: 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73  r from other VMs
a060: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61   in different da
a070: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a080: 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e  ns,.** so that n
a090: 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20  one of them try 
a0a0: 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20  to use the data 
a0b0: 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  at which they.**
a0c0: 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61   were pointing a
a0d0: 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79  nd which now may
a0e0: 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67   have been chang
a0f0: 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65  ed due.** to the
a100: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
a110: 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61   Remember that a
a120: 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65   rollback can de
a130: 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70  lete tables comp
a140: 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72  lete and.** reor
a150: 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20  der rootpages.  
a160: 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  So it is not suf
a170: 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20  ficient just to 
a180: 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74  save.** the stat
a190: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
a1a0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
a1b0: 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
a1c0: 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  or.** so that it
a1d0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
a1e0: 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gain..*/.static 
a1f0: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
a200: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
a210: 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a  Btrees(sqlite3 *
a220: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
a230: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
a240: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
a250: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
a260: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
a270: 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72   p && sqlite3Btr
a280: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
a290: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
a2a0: 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
a2b0: 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f  rs(p, SQLITE_ABO
a2c0: 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  RT);.    }.  }.}
a2d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
a2e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
a2f0: 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
a300: 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
a310: 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
a320: 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
a330: 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
a340: 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
a350: 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
a360: 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
a370: 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
a380: 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
a390: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
a3a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
a3b0: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
a3c0: 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
a3d0: 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
a3e0: 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
a3f0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
a400: 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
a410: 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
a420: 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
a430: 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
a440: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
a450: 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
a460: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
a470: 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
a480: 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
a490: 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
a4a0: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
a4b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
a4c0: 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
a4d0: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
a4e0: 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
a4f0: 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
a500: 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
a510: 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
a520: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
a530: 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
a540: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
a550: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  = p->db;.  int i
a560: 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  ;.  int (*xFunc)
a570: 28 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30  (Btree *pBt) = 0
a580: 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ;  /* Function t
a590: 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62  o call on each b
a5a0: 74 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a  tree backend */.
a5b0: 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
a5c0: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
a5d0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
a5e0: 69 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  if SQLITE_NOMEM 
a5f0: 6f 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f  or IOERR */..  /
a600: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a610: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
a620: 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
a630: 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
a640: 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
a650: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
a660: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
a670: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
a680: 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
a690: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
a6a0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a6b0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
a6c0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
a6d0: 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
a6e0: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
a6f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
a700: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
a710: 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
a720: 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
a730: 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
a740: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
a750: 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
a760: 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
a770: 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
a780: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
a790: 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
a7a0: 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
a7b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
a7c0: 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
a7d0: 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
a7e0: 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
a7f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
a800: 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
a810: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
a820: 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
a830: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a840: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
a850: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a860: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
a870: 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56  orsExceptActiveV
a880: 74 61 62 73 28 70 29 3b 0a 20 20 69 66 28 20 70  tabs(p);.  if( p
a890: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
a8a0: 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
a8b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a8c0: 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
a8d0: 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
a8e0: 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
a8f0: 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
a900: 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
a910: 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a   never started *
a920: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
a930: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
a940: 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
a950: 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
a960: 3e 72 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c  >rc */..    /* L
a970: 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75  ock all btrees u
a980: 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  sed by the state
a990: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ment */.    sqli
a9a0: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
a9b0: 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74  ayEnter(&p->aMut
a9c0: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  ex);..    /* Che
a9d0: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
a9e0: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
a9f0: 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
aa00: 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
aa10: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
aa20: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
aa30: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
aa40: 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
aa60: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
aa70: 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
aa80: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
aa90: 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
aaa0: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  r ){.      /* Th
aab0: 69 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61  is loop does sta
aac0: 74 69 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20  tic analysis of 
aad0: 74 68 65 20 71 75 65 72 79 20 74 6f 20 73 65 65  the query to see
aae0: 20 77 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20   which of the.  
aaf0: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
ab00: 20 74 68 72 65 65 20 63 61 74 65 67 6f 72 69 65   three categorie
ab10: 73 20 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a  s it falls into:
ab20: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
ab30: 2a 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79  **     Read-only
ab40: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75  .      **     Qu
ab50: 65 72 79 20 77 69 74 68 20 73 74 61 74 65 6d 65  ery with stateme
ab60: 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt journal.     
ab70: 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77 69   **     Query wi
ab80: 74 68 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20  thout statement 
ab90: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
aba0: 0a 20 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75  .      ** We cou
abb0: 6c 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ld do something 
abc0: 6d 6f 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61  more elegant tha
abd0: 6e 20 74 68 69 73 20 73 74 61 74 69 63 20 61 6e  n this static an
abe0: 61 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20  alysis (i.e..   
abf0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
ac00: 74 79 70 65 20 6f 66 20 71 75 65 72 79 20 61 73  type of query as
ac10: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d   part of the com
ac20: 70 6c 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c  pliation phase),
ac30: 20 62 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68   but .      ** h
ac40: 61 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29  andling malloc()
ac50: 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 20 69   or IO failure i
ac60: 73 20 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75  s a fairly obscu
ac70: 72 65 20 65 64 67 65 20 63 61 73 65 20 73 6f 20  re edge case so 
ac80: 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69  .      ** this i
ac90: 73 20 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65  s probably easie
aca0: 72 2e 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62  r. Todo: Might b
acb0: 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  e an opportunity
acc0: 20 74 6f 20 72 65 64 75 63 65 20 0a 20 20 20 20   to reduce .    
acd0: 20 20 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20 61    ** code size a
ace0: 20 76 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75   very small amou
acf0: 6e 74 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20  nt though....   
ad00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
ad10: 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  notReadOnly = 0;
ad20: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 53 74 61  .      int isSta
ad30: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
ad40: 20 20 61 73 73 65 72 74 28 70 2d 3e 61 4f 70 20    assert(p->aOp 
ad50: 7c 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20  || p->nOp==0);. 
ad60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ad70: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20  p->nOp; i++){ . 
ad80: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70         switch( p
ad90: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20  ->aOp[i].opcode 
ada0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
adb0: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
adc0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f  :.            no
add0: 74 52 65 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e  tReadOnly |= p->
ade0: 61 4f 70 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20  aOp[i].p2;.     
adf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ae00: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
ae10: 53 74 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20  Statement:.     
ae20: 20 20 20 20 20 20 20 69 73 53 74 61 74 65 6d 65         isStateme
ae30: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
ae40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ae50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
ae60: 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
ae70: 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
ae80: 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64  -only, we need d
ae90: 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74  o no rollback at
aea0: 20 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c   all. Otherwise,
aeb0: 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65  .      ** procee
aec0: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
aed0: 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20  al handling..   
aee0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
aef0: 6e 6f 74 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  notReadOnly || m
af00: 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
af10: 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
af20: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
af30: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
af40: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
af50: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
af60: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
af70: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
af80: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
af90: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
afa0: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20       } else if( 
afb0: 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
afc0: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
afd0: 45 5f 46 55 4c 4c 29 20 26 26 20 69 73 53 74 61  E_FULL) && isSta
afe0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
aff0: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
b000: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
b010: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  Stmt;.        }e
b020: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
b030: 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
b040: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
b050: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
b060: 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
b070: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
b080: 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
b090: 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
b0a0: 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
b0b0: 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
b0c0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
b0d0: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
b0e0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
b0f0: 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
b100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b110: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
b120: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
b130: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
b140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b150: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
b160: 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
b170: 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
b180: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
b190: 6e 6c 79 20 61 63 74 69 76 65 20 76 64 62 65 2c  nly active vdbe,
b1a0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   then.    ** we 
b1b0: 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
b1c0: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
b1d0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
b1e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
b1f0: 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
b200: 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
b210: 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
b220: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
b230: 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
b240: 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
b250: 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
b260: 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
b270: 6d 69 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76  mit && db->activ
b280: 65 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20  eVdbeCnt==1 ){. 
b290: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
b2a0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
b2b0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
b2c0: 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
b2d0: 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
b2e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
b2f0: 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
b300: 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64  true, and the vd
b310: 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a  be program was .
b320: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65          ** succe
b330: 73 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20  ssful or hit an 
b340: 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
b350: 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  aint. This means
b360: 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
b370: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
b380: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
b390: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76        int rc = v
b3a0: 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  dbeCommit(db);. 
b3b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
b3c0: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
b3d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
b3e0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
b3f0: 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
b400: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
b410: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
b420: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b430: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b440: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
b450: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
b460: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
b470: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
b480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b490: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
b4a0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
b4b0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
b4c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b4d0: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
b4e0: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
b4f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
b500: 28 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20  ( !xFunc ){.    
b510: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
b520: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
b530: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
b540: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
b550: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
b560: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
b570: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
b580: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b  BtreeCommitStmt;
b590: 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
b5a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
b5b0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
b5c0: 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
b5d0: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
b5e0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
b5f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b600: 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
b610: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
b620: 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
b630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
b640: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
b650: 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
b660: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
b670: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
b680: 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f  * If xFunc is no
b690: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
b6a0: 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65  is one of sqlite
b6b0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
b6c0: 6d 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  mt or.    ** sql
b6d0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
b6e0: 74 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63  tmt. Call it onc
b6f0: 65 20 6f 6e 20 65 61 63 68 20 62 61 63 6b 65 6e  e on each backen
b700: 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
b710: 63 63 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64  ccurs.    ** and
b720: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
b730: 20 69 73 20 73 74 69 6c 6c 20 53 51 4c 49 54 45   is still SQLITE
b740: 5f 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74  _OK, set the ret
b750: 75 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20  urn code to the 
b760: 6e 65 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  new.    ** error
b770: 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
b780: 20 20 20 61 73 73 65 72 74 28 21 78 46 75 6e 63     assert(!xFunc
b790: 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d   ||.      xFunc=
b7a0: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d  =sqlite3BtreeCom
b7b0: 6d 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20  mitStmt ||.     
b7c0: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
b7d0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
b7e0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28  .    );.    for(
b7f0: 69 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c  i=0; xFunc && i<
b800: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
b810: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
b820: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
b830: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
b840: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
b850: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 78  {.        rc = x
b860: 46 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20  Func(pBt);.     
b870: 20 20 20 69 66 28 20 72 63 20 26 26 20 28 70 2d     if( rc && (p-
b880: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
b890: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
b8a0: 43 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20  CONSTRAINT) ){. 
b8b0: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
b8c0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
b8d0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
b8e0: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b  &p->zErrMsg, 0);
b8f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b900: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
b910: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
b920: 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
b930: 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74   or DELETE and t
b940: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  he statement was
b950: 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20   committed, .   
b960: 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e   ** set the chan
b970: 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge counter. .   
b980: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
b990: 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d  hangeCntOn && p-
b9a0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
b9b0: 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46  if( !xFunc || xF
b9c0: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
b9d0: 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20  eCommitStmt ){. 
b9e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b9f0: 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
ba00: 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
ba10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ba20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
ba30: 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
ba40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ba50: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
ba60: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
ba70: 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ollback or commi
ba80: 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61  t any schema cha
ba90: 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72  nges that occurr
baa0: 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
bab0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
bac0: 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  && db->flags&SQL
bad0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
bae0: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
baf0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
bb00: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
bb10: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20      db->flags = 
bb20: 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c  (db->flags | SQL
bb30: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
bb40: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
bb50: 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
bb60: 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
bb70: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
bb80: 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65  yLeave(&p->aMute
bb90: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  x);.  }..  /* We
bba0: 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
bbb0: 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
bbc0: 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
bbd0: 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
bbe0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
bbf0: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74  0 ){.    db->act
bc00: 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20  iveVdbeCnt--;.  
bc10: 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
bc20: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
bc30: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
bc40: 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
bc50: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
bc60: 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
bc70: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
bc80: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
bc90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
bca0: 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
bcb0: 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
bcc0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
bcd0: 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
bce0: 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
bcf0: 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
bd00: 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
bd10: 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
bd20: 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
bd30: 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
bd40: 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
bd50: 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
bd60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bd70: 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
bd80: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
bd90: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
bda0: 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
bdb0: 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
bdc0: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
bdd0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
bde0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
bdf0: 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
be00: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
be10: 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
be20: 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
be30: 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
be40: 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
be50: 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
be60: 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
be70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
be80: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
be90: 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
bea0: 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
beb0: 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
bec0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
bed0: 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
bee0: 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
bef0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
bf00: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 66 72  (Vdbe *p, int fr
bf10: 65 65 62 75 66 66 65 72 73 29 7b 0a 20 20 73 71  eebuffers){.  sq
bf20: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
bf30: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
bf40: 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
bf50: 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
bf60: 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
bf70: 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
bf80: 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
bf90: 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
bfa0: 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
bfb0: 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
bfc0: 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
bfd0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
bfe0: 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71  fetyOn(db);.  sq
bff0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
c000: 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ;.  (void)sqlite
c010: 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a  3SafetyOff(db);.
c020: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
c030: 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
c040: 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
c050: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
c060: 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
c070: 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
c080: 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
c090: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
c0a0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
c0b0: 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
c0c0: 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
c0d0: 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
c0e0: 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
c0f0: 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
c100: 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
c110: 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
c120: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
c130: 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
c140: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
c150: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
c160: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
c170: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
c180: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
c190: 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c  Str(db->pErr,-1,
c1a0: 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54  p->zErrMsg,SQLIT
c1b0: 45 5f 55 54 46 38 2c 73 71 6c 69 74 65 33 5f 66  E_UTF8,sqlite3_f
c1c0: 72 65 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  ree);.      db->
c1d0: 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b  errCode = p->rc;
c1e0: 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  .      p->zErrMs
c1f0: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
c200: 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
c210: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c220: 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  (db, p->rc, 0);.
c230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c240: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
c250: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
c260: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
c270: 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
c280: 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
c290: 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
c2a0: 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
c2b0: 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
c2c0: 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
c2d0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
c2e0: 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
c2f0: 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
c300: 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
c310: 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
c320: 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
c330: 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
c340: 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
c350: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
c360: 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
c370: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
c380: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
c390: 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
c3a0: 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
c3b0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
c3c0: 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
c3d0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
c3e0: 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
c3f0: 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
c400: 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
c410: 70 28 70 2c 20 66 72 65 65 62 75 66 66 65 72 73  p(p, freebuffers
c420: 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
c430: 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
c440: 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
c450: 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
c460: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
c470: 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
c480: 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
c490: 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
c4a0: 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
c4b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
c4c0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
c4d0: 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
c4e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c4f0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
c500: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
c510: 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
c520: 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
c530: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
c540: 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
c550: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c560: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
c570: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
c580: 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
c590: 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
c5a0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
c5b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
c5c0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
c5d0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
c5e0: 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
c5f0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
c600: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
c610: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
c620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
c630: 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
c640: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
c650: 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
c660: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
c670: 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
c680: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
c690: 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64  IT;.  p->aborted
c6a0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
c6b0: 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
c6c0: 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
c6d0: 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
c6e0: 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
c6f0: 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
c700: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
c710: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
c720: 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
c730: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
c740: 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
c750: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
c760: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
c770: 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
c780: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c790: 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
c7a0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
c7b0: 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
c7c0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
c7d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c7e0: 65 33 56 64 62 65 52 65 73 65 74 28 70 2c 20 31  e3VdbeReset(p, 1
c7f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
c800: 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
c810: 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65  ask)==rc );.  }e
c820: 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  lse if( p->magic
c830: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  !=VDBE_MAGIC_INI
c840: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
c850: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
c860: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
c870: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
c880: 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 31 29 3b 0a 20  , p->nMem, 1);. 
c890: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
c8a0: 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
c8b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  rc;.}../*.** Cal
c8c0: 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  l the destructor
c8d0: 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74   for each auxdat
c8e0: 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65  a entry in pVdbe
c8f0: 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a  Func for which.*
c900: 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
c910: 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20  ing bit in mask 
c920: 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61  is clear.  Auxda
c930: 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e  ta entries beyon
c940: 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61  d 31.** are alwa
c950: 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54  ys destroyed.  T
c960: 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75  o destroy all au
c970: 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63  xdata entries, c
c980: 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  all this.** rout
c990: 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30  ine with mask==0
c9a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c9b0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
c9c0: 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64  ta(VdbeFunc *pVd
c9d0: 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b  beFunc, int mask
c9e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
c9f0: 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75  r(i=0; i<pVdbeFu
ca00: 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a  nc->nAux; i++){.
ca10: 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61      struct AuxDa
ca20: 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62  ta *pAux = &pVdb
ca30: 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b  eFunc->apAux[i];
ca40: 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c  .    if( (i>31 |
ca50: 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29  | !(mask&(1<<i))
ca60: 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20  ) && pAux->pAux 
ca70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  ){.      if( pAu
ca80: 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
ca90: 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
caa0: 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
cab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cac0: 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  Aux->pAux = 0;. 
cad0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
cae0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
caf0: 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
cb00: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
cb10: 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  te(Vdbe *p){.  i
cb20: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
cb30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65   ) return;.  Cle
cb40: 61 6e 75 70 28 70 2c 20 31 29 3b 0a 20 20 69 66  anup(p, 1);.  if
cb50: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
cb60: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
cb70: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
cb80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
cb90: 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d  t( p->db->pVdbe=
cba0: 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d  =p );.    p->db-
cbb0: 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
cbc0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
cbd0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
cbe0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
cbf0: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
cc00: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
cc10: 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f   Op *pOp = p->aO
cc20: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
cc30: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70  i<p->nOp; i++, p
cc40: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
cc50: 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c  eP4(pOp->p4type,
cc60: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
cc70: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
cc80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
cc90: 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  ree(pOp->zCommen
cca0: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
ccb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ccc0: 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a  3_free(p->aOp);.
ccd0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
cce0: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
ccf0: 2d 3e 6e 56 61 72 2c 20 31 29 3b 0a 20 20 73 71  ->nVar, 1);.  sq
cd00: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c  lite3_free(p->aL
cd10: 61 62 65 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e  abel);.  if( p->
cd20: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  aMem ){.    sqli
cd30: 74 65 33 5f 66 72 65 65 28 26 70 2d 3e 61 4d 65  te3_free(&p->aMe
cd40: 6d 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  m[1]);.  }.  rel
cd50: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
cd60: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
cd70: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
cd80: 4e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  N, 1);.  sqlite3
cd90: 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d  _free(p->aColNam
cda0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
cdb0: 65 65 28 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70  ee(p->zSql);.  p
cdc0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
cdd0: 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c  AGIC_DEAD;.  sql
cde0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
cdf0: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  ./*.** If a Move
ce00: 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
ce10: 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
ce20: 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
ce30: 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
ce40: 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e  eTo now.  Return
ce50: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
ce60: 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73   If no MoveTo is
ce70: 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a   pending, this.*
ce80: 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  * routine does n
ce90: 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72  othing and retur
cea0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
ceb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
cec0: 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72  CursorMoveto(Cur
ced0: 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
cee0: 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
cef0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
cf00: 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
cf10: 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
cf20: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
cf30: 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
cf40: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
cf50: 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
cf60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
cf70: 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75  reeMoveto(p->pCu
cf80: 72 73 6f 72 2c 20 30 2c 20 30 2c 20 70 2d 3e 6d  rsor, 0, 0, p->m
cf90: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
cfa0: 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
cfb0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
cfc0: 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20     *p->pIncrKey 
cfd0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74  = 0;.    p->last
cfe0: 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74  Rowid = keyToInt
cff0: 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  (p->movetoTarget
d000: 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  );.    p->rowidI
d010: 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b  sValid = res==0;
d020: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
d030: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d040: 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d  ite3BtreeNext(p-
d050: 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
d060: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
d070: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
d080: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
d090: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
d0a0: 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
d0b0: 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
d0c0: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
d0d0: 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
d0e0: 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
d0f0: 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LE;.  }.  return
d100: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d110: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
d120: 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
d130: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
d140: 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
d150: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d160: 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
d170: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52 65  ite3VdbeSerialRe
d180: 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ad().** sqlite3V
d190: 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
d1a0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
d1b0: 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a  ialWrite().**.**
d1c0: 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
d1d0: 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
d1e0: 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
d1f0: 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
d200: 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
d210: 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
d220: 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
d230: 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
d240: 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
d250: 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
d260: 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
d270: 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
d280: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
d290: 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
d2a0: 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
d2b0: 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
d2c0: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
d2d0: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
d2e0: 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
d2f0: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
d300: 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
d310: 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
d320: 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
d330: 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
d340: 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
d350: 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
d360: 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
d370: 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
d380: 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
d390: 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
d3a0: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
d3b0: 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
d3c0: 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
d3d0: 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
d3e0: 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74  ata blob seperat
d3f0: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
d400: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
d410: 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
d420: 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
d430: 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
d440: 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
d450: 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
d460: 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
d470: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d480: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
d490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
d4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
d4b0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
d4c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
d4d0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
d4e0: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
d4f0: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
d500: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
d510: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
d540: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
d550: 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
d570: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
d580: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
d590: 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
d5a0: 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
d5b0: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
d5c0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
d5f0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
d600: 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
d620: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
d630: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
d640: 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
d650: 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
d660: 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
d670: 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
d690: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
d6a0: 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
d6b0: 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
d6c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
d6d0: 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
d6e0: 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
d6f0: 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d710: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
d720: 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
d730: 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
d740: 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
d750: 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
d760: 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
d770: 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
d780: 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
d790: 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
d7a0: 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
d7b0: 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
d7c0: 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
d7d0: 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
d7e0: 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
d7f0: 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
d800: 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
d810: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d820: 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
d830: 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
d840: 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
d850: 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
d860: 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
d870: 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
d880: 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61  rmat){.  int fla
d890: 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
d8a0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66  ;.  int n;..  if
d8b0: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
d8c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d8d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
d8e0: 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
d8f0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
d900: 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
d910: 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
d920: 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
d930: 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
d940: 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
d950: 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
d960: 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
d970: 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
d980: 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  f( file_format>=
d990: 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b  4 && (i&1)==i ){
d9a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b  .      return 8+
d9b0: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d  i;.    }.    u =
d9c0: 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20   i<0 ? -i : i;. 
d9d0: 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20     if( u<=127 ) 
d9e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
d9f0: 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74  ( u<=32767 ) ret
da00: 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75  urn 2;.    if( u
da10: 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75  <=8388607 ) retu
da20: 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 3;.    if( u<
da30: 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65  =2147483647 ) re
da40: 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20  turn 4;.    if( 
da50: 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72  u<=MAX_6BYTE ) r
da60: 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74  eturn 5;.    ret
da70: 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
da80: 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
da90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  ){.    return 7;
daa0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66  .  }.  assert( f
dab0: 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
dac0: 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
dad0: 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
dae0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
daf0: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
db00: 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61 73  m->u.i;.  }.  as
db10: 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
db20: 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
db30: 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
db40: 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
db50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
db60: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
db70: 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
db80: 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
db90: 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
dba0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
dbb0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
dbc0: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
dbd0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
dbe0: 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
dbf0: 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
dc00: 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
dc10: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
dc20: 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
dc30: 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
dc40: 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
dc50: 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
dc60: 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
dc70: 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
dc80: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
dc90: 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
dca0: 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
dcb0: 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
dcc0: 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
dcd0: 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
dce0: 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
dcf0: 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
dd00: 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
dd10: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
dd20: 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
dd30: 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
dd40: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
dd50: 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
dd60: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
dd70: 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
dd80: 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
dd90: 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
dda0: 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
ddb0: 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
ddc0: 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
ddd0: 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
dde0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
ddf0: 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
de00: 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
de10: 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
de20: 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
de30: 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
de40: 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
de50: 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
de60: 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
de70: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
de80: 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
de90: 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
dea0: 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
deb0: 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
dec0: 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
ded0: 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
dee0: 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
def0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
df00: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
df10: 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
df20: 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
df30: 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
df40: 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
df50: 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
df60: 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
df70: 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
df80: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
df90: 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
dfa0: 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
dfb0: 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
dfc0: 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
dfd0: 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
dfe0: 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
dff0: 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
e000: 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
e010: 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
e020: 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
e030: 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
e040: 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
e050: 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
e060: 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
e070: 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
e080: 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
e090: 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
e0a0: 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
e0b0: 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
e0c0: 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
e0d0: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
e0e0: 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
e0f0: 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
e100: 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
e110: 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
e120: 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
e130: 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
e140: 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
e150: 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
e160: 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
e170: 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
e180: 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
e190: 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
e1a0: 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
e1b0: 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
e1c0: 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
e1d0: 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
e1e0: 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
e1f0: 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
e200: 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
e210: 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
e220: 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
e230: 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
e240: 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
e250: 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
e260: 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
e270: 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
e280: 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
e290: 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
e2a0: 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
e2b0: 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
e2c0: 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
e2d0: 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
e2e0: 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
e2f0: 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
e300: 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
e310: 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
e320: 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
e330: 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
e340: 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
e350: 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
e360: 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
e370: 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
e380: 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
e390: 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
e3a0: 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
e3b0: 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
e3c0: 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
e3d0: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
e3e0: 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
e3f0: 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
e400: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
e410: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
e420: 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
e430: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
e440: 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
e450: 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
e460: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
e470: 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
e480: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
e490: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
e4a0: 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
e4b0: 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
e4c0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
e4d0: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
e4e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
e4f0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
e500: 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
e510: 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61  [].  nBuf must a
e520: 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67  lways be.** larg
e530: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
e540: 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
e550: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  d.  Except, if t
e560: 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61  he field is.** a
e570: 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72   blob with a zer
e580: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74  o-filled tail, t
e590: 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20  hen buf[] might 
e5a0: 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68  be just the righ
e5b0: 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c  t.** size to hol
e5c0: 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63  d everything exc
e5d0: 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  ept for the zero
e5e0: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49  -filled tail.  I
e5f0: 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e  f buf[].** is on
e600: 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ly big enough to
e610: 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65   hold the non-ze
e620: 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20  ro prefix, then 
e630: 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a  only write that.
e640: 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62  ** prefix into b
e650: 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75  uf[].  But if bu
e660: 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  f[] is large eno
e670: 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ugh to hold both
e680: 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61   the.** prefix a
e690: 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e  nd the tail then
e6a0: 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69   write the prefi
e6b0: 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61  x and set the ta
e6c0: 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72  il to all.** zer
e6d0: 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  os..**.** Return
e6e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
e6f0: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
e700: 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
e710: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
e720: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
e730: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
e740: 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
e750: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
e760: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
e770: 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
e780: 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
e790: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
e7a0: 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
e7b0: 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d  buf, int nBuf, M
e7c0: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
e7d0: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
e7e0: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
e7f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e800: 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
e810: 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20  _format);.  int 
e820: 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
e830: 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
e840: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
e850: 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
e860: 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
e870: 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  v;.    int i;.  
e880: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
e890: 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
e8a0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
e8b0: 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
e8c0: 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
e8d0: 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73  (&v, &pMem->r, s
e8e0: 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
e8f0: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
e900: 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
e910: 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
e920: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
e930: 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
e940: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
e950: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
e960: 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
e970: 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20   len<=nBuf );.  
e980: 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
e990: 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
e9a0: 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
e9b0: 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20   >>= 8;.    }.  
e9c0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
e9d0: 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
e9e0: 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
e9f0: 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
ea00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ea10: 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
ea20: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
ea30: 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a  o)?pMem->u.i:0).
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
ea50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ea60: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
ea70: 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73  type) );.    ass
ea80: 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42  ert( pMem->n<=nB
ea90: 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  uf );.    len = 
eaa0: 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d  pMem->n;.    mem
eab0: 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
eac0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  , len);.    if( 
ead0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
eae0: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
eaf0: 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69  len += pMem->u.i
eb00: 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e  ;.      if( len>
eb10: 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
eb20: 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20  len = nBuf;.    
eb30: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
eb40: 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20  (&buf[pMem->n], 
eb50: 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b  0, len-pMem->n);
eb60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
eb70: 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
eb80: 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
eb90: 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
eba0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ebb0: 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
ebc0: 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
ebd0: 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
ebe0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
ebf0: 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
ec00: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
ec10: 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
ec20: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
ec30: 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
ec40: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
ec50: 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
ec60: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
ec70: 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
ec80: 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
ec90: 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
eca0: 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
ecb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
ecc0: 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
ecd0: 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
ece0: 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
ed00: 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
ed10: 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
ed20: 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
ed30: 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
ed40: 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
ed50: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
ed60: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
ed70: 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
ed80: 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
ed90: 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
eda0: 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a   0: {  /* NULL *
edb0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
edc0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
edd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ede0: 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
edf0: 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
ee00: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
ee10: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
ee20: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
ee30: 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0];.      pMem->
ee40: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
ee50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
ee60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ee70: 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
ee80: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
ee90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
eea0: 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
eeb0: 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
eec0: 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[1];.      pM
eed0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
eee0: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
eef0: 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
ef00: 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
ef10: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
ef20: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
ef30: 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
ef40: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31   char)buf[0])<<1
ef50: 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29  6) | (buf[1]<<8)
ef60: 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20   | buf[2];.     
ef70: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ef80: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
ef90: 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
efa0: 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
efb0: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
efc0: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
efd0: 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30  em->u.i = (buf[0
efe0: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
eff0: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
f000: 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
f010: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f020: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
f030: 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
f040: 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
f050: 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
f060: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
f070: 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e   u64 x = (((sign
f080: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
f090: 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
f0a0: 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66      u32 y = (buf
f0b0: 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [2]<<24) | (buf[
f0c0: 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34  3]<<16) | (buf[4
f0d0: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a  ]<<8) | buf[5];.
f0e0: 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
f0f0: 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65  ) | y;.      pMe
f100: 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
f110: 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  &x;.      pMem->
f120: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
f130: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
f140: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f150: 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
f160: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
f170: 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
f180: 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
f190: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75  point */.      u
f1a0: 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20  64 x;.      u32 
f1b0: 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  y;.#if !defined(
f1c0: 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
f1d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f1e0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
f1f0: 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
f200: 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
f210: 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
f220: 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
f230: 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
f240: 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
f250: 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
f260: 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
f270: 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
f280: 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
f290: 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
f2a0: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
f2b0: 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
f2c0: 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
f2d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
f2e0: 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
f2f0: 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
f300: 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
f310: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
f320: 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
f330: 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
f340: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
f350: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
f360: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f370: 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
f380: 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
f390: 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
f3a0: 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
f3b0: 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28  dif..      x = (
f3c0: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
f3d0: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
f3e0: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
f3f0: 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75  ];.      y = (bu
f400: 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[4]<<24) | (buf
f410: 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [5]<<16) | (buf[
f420: 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b  6]<<8) | buf[7];
f430: 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
f440: 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66  2) | y;.      if
f450: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
f460: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
f470: 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
f480: 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  x;.        pMem-
f490: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
f4a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f4b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
f4c0: 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
f4d0: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
f4e0: 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61  8 );.        swa
f4f0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
f500: 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  t(x);.        me
f510: 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26  mcpy(&pMem->r, &
f520: 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
f530: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
f540: 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
f550: 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d  N(pMem->r) ? MEM
f560: 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
f570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f580: 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a  return 8;.    }.
f590: 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
f5a0: 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
f5b0: 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
f5c0: 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
f5d0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
f5e0: 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
f5f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f600: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
f610: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
f620: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
f630: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  .      int len =
f640: 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
f650: 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
f660: 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
f670: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
f680: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
f690: 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
f6a0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
f6b0: 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20  pe&0x01 ){.     
f6c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f6d0: 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45   MEM_Str | MEM_E
f6e0: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  phem;.      }els
f6f0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  e{.        pMem-
f700: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
f710: 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  b | MEM_Ephem;. 
f720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
f730: 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
f740: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
f750: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  .../*.** Given t
f760: 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
f770: 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
f780: 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72  d in pKey[], par
f790: 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  se the.** record
f7a0: 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64   into a Unpacked
f7b0: 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
f7c0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
f7d0: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
f7e0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
f7f0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
f800: 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69  tion might provi
f810: 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73  de szSpace bytes
f820: 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70   of memory.** sp
f830: 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20  ace at pSpace.  
f840: 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62  This space can b
f850: 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  e used to hold t
f860: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56  he returned.** V
f870: 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20  DbeParsedRecord 
f880: 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20  structure if it 
f890: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e  is large enough.
f8a0: 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f    If it is.** no
f8b0: 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70  t big enough, sp
f8c0: 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ace is obtained 
f8d0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
f8e0: 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  loc()..**.** The
f8f0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74   returned struct
f900: 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ure should be cl
f910: 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  osed by a call t
f920: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  o.** sqlite3Vdbe
f930: 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
f940: 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61  cord()..*/ .Unpa
f950: 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
f960: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
f970: 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
f980: 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
f990: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
f9a0: 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
f9b0: 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
f9c0: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
f9d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
f9e0: 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
f9f0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
fa00: 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
fa10: 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
fa20: 2f 0a 20 20 76 6f 69 64 20 2a 70 53 70 61 63 65  /.  void *pSpace
fa30: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  ,          /* Sp
fa40: 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ace available to
fa50: 20 68 6f 6c 64 20 72 65 73 75 6c 74 69 6e 67 20   hold resulting 
fa60: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
fa70: 73 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20  szSpace         
fa80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
fa90: 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
faa0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
fab0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
fac0: 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
fad0: 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
fae0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
faf0: 64 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74  d *p;.  int nByt
fb00: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 78 2c  e;.  int i, idx,
fb10: 20 64 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   d;.  u32 szHdr;
fb20: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20  .  Mem *pMem;.  
fb30: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
fb40: 66 28 4d 65 6d 29 3e 73 69 7a 65 6f 66 28 2a 70  f(Mem)>sizeof(*p
fb50: 29 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  ) );.  nByte = s
fb60: 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
fb70: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29 3b  Info->nField+2);
fb80: 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
fb90: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20  pace ){.    p = 
fba0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
fbb0: 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
fbc0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
fbd0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
fbe0: 3b 0a 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65  ;.    p->needFre
fbf0: 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
fc00: 20 20 20 20 70 20 3d 20 70 53 70 61 63 65 3b 0a      p = pSpace;.
fc10: 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65 20      p->needFree 
fc20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  = 0;.  }.  p->pK
fc30: 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
fc40: 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
fc50: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
fc60: 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 6e 65 65 64  d + 1;.  p->need
fc70: 44 65 73 74 72 6f 79 20 3d 20 31 3b 0a 20 20 70  Destroy = 1;.  p
fc80: 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20  ->aMem = pMem = 
fc90: 26 28 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b 0a 20  &((Mem*)p)[1];. 
fca0: 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
fcb0: 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
fcc0: 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
fcd0: 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
fce0: 69 64 78 3c 73 7a 48 64 72 20 26 26 20 69 3c 70  idx<szHdr && i<p
fcf0: 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20  ->nField ){.    
fd00: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
fd10: 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
fd20: 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 2b 69  Varint32( aKey+i
fd30: 64 78 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  dx, serial_type)
fd40: 3b 0a 20 20 20 20 69 66 28 20 64 3e 3d 6e 4b 65  ;.    if( d>=nKe
fd50: 79 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  y && sqlite3Vdbe
fd60: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
fd70: 72 69 61 6c 5f 74 79 70 65 29 3e 30 20 29 20 62  rial_type)>0 ) b
fd80: 72 65 61 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  reak;.    pMem->
fd90: 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
fda0: 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
fdb0: 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
fdc0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
fdd0: 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  s = 0;.    pMem-
fde0: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
fdf0: 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
fe00: 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
fe10: 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
fe20: 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
fe30: 65 6d 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20  em++;.    i++;. 
fe40: 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d   }.  p->nField =
fe50: 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   i;.  return (vo
fe60: 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  id*)p;.}../*.** 
fe70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73  This routine des
fe80: 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64  troys a Unpacked
fe90: 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f  Record object.*/
fea0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
feb0: 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
fec0: 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65  ecord(UnpackedRe
fed0: 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
fee0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
fef0: 6e 65 65 64 44 65 73 74 72 6f 79 20 29 7b 0a 20  needDestroy ){. 
ff00: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
ff10: 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20    Mem *pMem;.   
ff20: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d     for(i=0, pMem
ff30: 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e  =p->aMem; i<p->n
ff40: 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d  Field; i++, pMem
ff50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
ff60: 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
ff70: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
ff80: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
ff90: 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  e(pMem);.       
ffa0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ffb0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64  .    if( p->need
ffc0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Free ){.      sq
ffd0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
ffe0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
fff0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10000 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
10010 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
10020 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
10030 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
10040 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
10050 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
10060 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
10070 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
10080 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b  ive integer if {
10090 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73  nKey1, pKey1} is
100a0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
100b0 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
100c0 74 65 72 20 74 68 61 6e 20 70 50 4b 65 79 32 2e  ter than pPKey2.
100d0 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
100e0 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
100f0 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
10100 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65  ed by th OP_Make
10110 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
10120 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
10130 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
10140 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
10150 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
10160 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
10170 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
10180 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  rd..**.** Key1 a
10190 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
101a0 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
101b0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
101c0 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 42 75 74  f fields..** But
101d0 20 69 66 20 74 68 65 20 6c 65 6e 67 74 68 73 20   if the lengths 
101e0 64 69 66 66 65 72 2c 20 4b 65 79 32 20 6d 75 73  differ, Key2 mus
101f0 74 20 62 65 20 74 68 65 20 73 68 6f 72 74 65 72  t be the shorter
10200 20 6f 66 20 74 68 65 20 74 77 6f 2e 0a 2a 2a 0a   of the two..**.
10210 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 6e 6f  ** Historical no
10220 74 65 3a 20 49 6e 20 65 61 72 6c 69 65 72 20 76  te: In earlier v
10230 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
10240 72 6f 75 74 69 6e 65 20 62 6f 74 68 20 4b 65 79  routine both Key
10250 31 0a 2a 2a 20 61 6e 64 20 4b 65 79 32 20 77 65  1.** and Key2 we
10260 72 65 20 62 6c 6f 62 73 20 6f 62 74 61 69 6e 65  re blobs obtaine
10270 64 20 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65 52 65  d from OP_MakeRe
10280 63 6f 72 64 2e 20 20 42 75 74 20 77 65 20 66 6f  cord.  But we fo
10290 75 6e 64 0a 2a 2a 20 74 68 61 74 20 69 6e 20 74  und.** that in t
102a0 79 70 69 63 61 6c 20 75 73 65 20 74 68 65 20 73  ypical use the s
102b0 61 6d 65 20 4b 65 79 32 20 77 6f 75 6c 64 20 62  ame Key2 would b
102c0 65 20 73 75 62 6d 69 74 74 65 64 20 6d 75 6c 74  e submitted mult
102d0 69 70 6c 65 20 74 69 6d 65 73 0a 2a 2a 20 69 6e  iple times.** in
102e0 20 61 20 72 6f 77 2e 20 20 53 6f 20 61 6e 20 6f   a row.  So an o
102f0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
10300 61 64 64 65 64 20 74 6f 20 70 61 72 73 65 20 74  added to parse t
10310 68 65 20 4b 65 79 32 20 6b 65 79 0a 2a 2a 20 73  he Key2 key.** s
10320 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 73 75  eparately and su
10330 62 6d 69 74 20 74 68 65 20 70 61 72 73 65 64 20  bmit the parsed 
10340 76 65 72 73 69 6f 6e 2e 20 20 49 6e 20 74 68 69  version.  In thi
10350 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 0a  s way, we avoid.
10360 2a 2a 20 70 61 72 73 69 6e 67 20 74 68 65 20 73  ** parsing the s
10370 61 6d 65 20 4b 65 79 32 20 6d 75 6c 74 69 70 6c  ame Key2 multipl
10380 65 20 74 69 6d 65 73 20 69 6e 20 61 20 72 6f 77  e times in a row
10390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
103a0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
103b0 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
103c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
103d0 31 2c 20 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  1, .  UnpackedRe
103e0 63 6f 72 64 20 2a 70 50 4b 65 79 32 0a 29 7b 0a  cord *pPKey2.){.
103f0 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
10400 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
10410 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
10420 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
10430 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
10440 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10450 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
10460 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
10470 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
10480 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
10490 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
104a0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
104b0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
104c0 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63  nField;.  int rc
104d0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
104e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
104f0 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
10500 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
10510 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
10520 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
10530 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
10540 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
10550 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d  fo;.  mem1.enc =
10560 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
10570 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
10580 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31  Info->db;.  mem1
10590 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65  .flags = 0;.  me
105a0 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  m1.zMalloc = 0;.
105b0 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
105c0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
105d0 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
105e0 7a 48 64 72 31 3b 0a 20 20 6e 46 69 65 6c 64 20  zHdr1;.  nField 
105f0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
10600 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78  ld;.  while( idx
10610 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
10620 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a  Key2->nField ){.
10630 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
10640 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
10650 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
10660 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
10670 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
10680 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
10690 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
106a0 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
106b0 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20  rial_type1 );.  
106c0 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20    if( d1>=nKey1 
106d0 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
106e0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
106f0 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72  al_type1)>0 ) br
10700 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  eak;..    /* Ext
10710 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
10720 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
10730 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
10740 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
10750 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
10760 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
10770 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
10780 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
10790 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
107a0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
107b0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
107c0 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20  y2->aMem[i],.   
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64          i<nField
107f0 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   ? pKeyInfo->aCo
10800 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20  ll[i] : 0);.    
10810 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
10820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10830 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69      i++;.  }.  i
10840 66 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  f( mem1.zMalloc 
10850 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
10860 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a  Release(&mem1);.
10870 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  .  /* One of the
10880 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
10890 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c   fields, but all
108a0 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
108b0 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a  o that point.  *
108c0 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66  * were equal. If
108d0 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61   the incrKey fla
108e0 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
108f0 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69  the second key i
10900 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61  s.  ** treated a
10910 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20  s larger..  */. 
10920 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
10930 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
10940 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20  incrKey ){.     
10950 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65   rc = -1;.    }e
10960 6c 73 65 20 69 66 28 20 21 70 4b 65 79 49 6e 66  lse if( !pKeyInf
10970 6f 2d 3e 70 72 65 66 69 78 49 73 45 71 75 61 6c  o->prefixIsEqual
10980 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 31   ){.      if( d1
10990 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  <nKey1 ){.      
109a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
109b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
109c0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
109d0 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b  ortOrder && i<pK
109e0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20  eyInfo->nField. 
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
10a00 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
10a10 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
10a20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20  rc = -rc;.  }.. 
10a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10a40 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
10a50 74 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e  t is an index en
10a60 74 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69  try composed usi
10a70 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
10a80 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
10a90 54 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  The last entry i
10aa0 6e 20 74 68 69 73 20 72 65 63 6f 72 64 20 73 68  n this record sh
10ab0 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
10ac0 65 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79  er (specifically
10ad0 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72  .** an integer r
10ae0 6f 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75  owid).  This rou
10af0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
10b00 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
10b10 20 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65   in.** that inte
10b20 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
10b30 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c  te3VdbeIdxRowidL
10b40 65 6e 28 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  en(const u8 *aKe
10b50 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  y){.  u32 szHdr;
10b60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10b70 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
10b80 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
10b90 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
10ba0 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
10bb0 20 2a 2f 0a 0a 20 20 28 76 6f 69 64 29 67 65 74   */..  (void)get
10bc0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
10bd0 7a 48 64 72 29 3b 0a 20 20 28 76 6f 69 64 29 67  zHdr);.  (void)g
10be0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
10bf0 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52  [szHdr-1], typeR
10c00 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  owid);.  return 
10c10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10c20 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
10c30 69 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a  id);.}.  ../*.**
10c40 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
10c50 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
10c60 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
10c70 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
10c80 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
10c90 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
10ca0 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
10cb0 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
10cc0 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
10cd0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
10ce0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
10cf0 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
10d00 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
10d10 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
10d20 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
10d30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
10d40 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
10d50 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
10d60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
10d70 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
10d80 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
10d90 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
10da0 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
10db0 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
10dc0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
10dd0 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
10de0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
10df0 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
10e00 76 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  v;..  sqlite3Btr
10e10 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
10e20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66  &nCellKey);.  if
10e30 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b  ( nCellKey<=0 ){
10e40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10e50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
10e60 0a 20 20 7d 0a 20 20 6d 2e 66 6c 61 67 73 20 3d  .  }.  m.flags =
10e70 20 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a   0;.  m.db = 0;.
10e80 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b    m.zMalloc = 0;
10e90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10ea0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
10eb0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65  pCur, 0, nCellKe
10ec0 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
10ed0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
10ee0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 28 76 6f 69  n rc;.  }.  (voi
10ef0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
10f00 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
10f10 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
10f20 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
10f30 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
10f40 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d  d);.  lenRowid =
10f50 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
10f60 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
10f70 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
10f80 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
10f90 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
10fa0 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
10fb0 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
10fc0 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
10fd0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
10fe0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
10ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11000 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
11010 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
11020 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
11030 20 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20   pC is point to 
11040 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
11050 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65  ey string in pKe
11060 79 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65  y (of length nKe
11070 79 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  y).  Write into 
11080 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
11090 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
110a0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
110b0 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
110c0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
110d0 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
110e0 72 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65  r than pKey.  Re
110f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
11100 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
11110 20 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20   pKey is either 
11120 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
11130 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
11140 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
11150 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
11160 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
11170 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
11180 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
11190 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
111a0 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
111b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
111c0 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
111d0 65 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c  e(.  Cursor *pC,
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
11200 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
11210 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
11220 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
11230 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  ,.  int nKey, co
11240 6e 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20  nst u8 *pKey,   
11250 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f  /* The key to co
11260 6d 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  mpare */.  int *
11270 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
11280 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11290 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
112a0 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
112b0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
112c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
112d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
112e0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
112f0 20 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20   int lenRowid;. 
11300 20 4d 65 6d 20 6d 3b 0a 20 20 55 6e 70 61 63 6b   Mem m;.  Unpack
11310 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 0a  edRecord *pRec;.
11320 20 20 63 68 61 72 20 7a 53 70 61 63 65 5b 32 30    char zSpace[20
11330 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  0];..  sqlite3Bt
11340 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
11350 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69   &nCellKey);.  i
11360 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29  f( nCellKey<=0 )
11370 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
11380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11390 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62  E_OK;.  }.  m.db
113a0 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67 73 20   = 0;.  m.flags 
113b0 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63  = 0;.  m.zMalloc
113c0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
113d0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
113e0 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
113f0 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31  , 0, nCellKey, 1
11400 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
11410 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11420 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
11430 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
11440 78 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d  xRowidLen((u8*)m
11450 2e 7a 29 3b 0a 20 20 69 66 28 20 21 70 55 6e 70  .z);.  if( !pUnp
11460 61 63 6b 65 64 20 29 7b 0a 20 20 20 20 70 52 65  acked ){.    pRe
11470 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
11480 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e  ecordUnpack(pC->
11490 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20  pKeyInfo, nKey, 
114a0 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 20 20 20 7a 53 70 61 63 65 2c 20 73 69        zSpace, si
114d0 7a 65 6f 66 28 7a 53 70 61 63 65 29 29 3b 0a 20  zeof(zSpace));. 
114e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 63   }else{.    pRec
114f0 20 3d 20 70 55 6e 70 61 63 6b 65 64 3b 0a 20 20   = pUnpacked;.  
11500 7d 0a 20 20 69 66 28 20 70 52 65 63 3d 3d 30 20  }.  if( pRec==0 
11510 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11520 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11530 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
11540 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
11550 65 28 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20  e(m.n-lenRowid, 
11560 6d 2e 7a 2c 20 70 52 65 63 29 3b 0a 20 20 69 66  m.z, pRec);.  if
11570 28 20 21 70 55 6e 70 61 63 6b 65 64 20 29 7b 0a  ( !pUnpacked ){.
11580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
11590 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
115a0 6f 72 64 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20  ord(pRec);.  }. 
115b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
115c0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
115d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
115e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
115f0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
11600 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
11610 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
11620 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
11630 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
11640 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
11650 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
11660 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11670 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
11680 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
11690 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
116a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
116b0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
116c0 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
116d0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
116e0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
116f0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
11700 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
11710 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
11720 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
11730 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
11740 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
11750 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
11760 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
11770 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
11780 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
11790 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
117a0 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
117b0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
117c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
117d0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
117e0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
117f0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
11800 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
11810 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
11820 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
11830 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
11840 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
11850 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
11860 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
11870 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
11880 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
11890 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
118a0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
118b0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
118c0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
118d0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
118e0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
118f0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
11900 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
11910 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
11920 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
11930 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
11940 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
11950 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
11960 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
11970 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
11980 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
11990 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
119a0 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
119b0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
119c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
119d0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
119e0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
119f0 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
11a00 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
11a10 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
11a20 3e 64 62 3b 0a 7d 0a                             >db;.}.